谷粒商城-分布式基础篇_02
Spring Cloud Alibaba Nacos 、Feign远程调用、 Gateway 基本使用

前言

谷粒商城分布式基础篇,涉及到很多Spring Cloud Alibaba的基础知识,我就不在笔记里详细介绍了。可以参考我的另一篇文章,对Spring Cloud Alibaba及其相关组件做了非常详细的介绍和使用说明。

👉Spring Cloud Alibaba 从入门到精通👈

Spring Cloud Alibaba Nacos

Spring Cloud Alibaba服务注册以及配置中心:Nacos

Nacos服务

  1. 下载Nacos

    👇下载链接👇

    nacos-server-1.1.3.zip

    nacos-server-1.1.3.tar.gz

  2. 解压下载到的Nacos包并执行bin目录中的运行命令

  3. 访问:[YourHost]:8848/nacos

  4. 默认账号密码:nacos/nacos

集成Nacos到项目

此步骤所有微服务都需要做

  1. 新增依赖

    1
    2
    3
    4
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
  2. 配置文件新增配置

    1
    2
    3
    4
    5
    6
    7
    8
    9
    spring:
    cloud:
    nacos:
    discovery:
    # nacos地址
    server-addr: 127.0.0.1:8848
    # 当前应用名称
    application:
    name: gulimall-coupon
  3. Spring Boot启动类新增@EnableDiscoveryClient注解

  4. 启动并观察Nacos管理界面中的服务列表中是否有应用注册

Feign声明式远程调用

编写测试Feign调用

  1. 引入依赖(查看是否以引入,以引入不需要再次引入)

    1
    2
    3
    4
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
  2. gulimall-coupon服务中加入新API

    CouponController中添加API

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @GetMapping("/member/list")
    public R list() {
    List<CouponEntity> list = new ArrayList<>();
    CouponEntity couponEntity = new CouponEntity();
    couponEntity.setCouponName("优惠券: 满100减10");
    list.add(couponEntity);

    return R.ok().put("data", list);
    }
  3. gulimall-member中编写Feign Client

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    package com.imxushuai.gulimall.member.feign;

    import com.imxushuai.common.utils.R;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;

    @FeignClient("gulimall-coupon")
    public interface CouponFeignService {
    @GetMapping("coupon/coupon/member/list")
    public R list();
    }
  4. gulimall-member的启动类中使用@EnableFeignClients注解开启允许Feign Client远程调用

  5. gulimall-member中编写API并远程调用gulimall-coupon中的API

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    @Autowired
    private CouponFeignService couponFeignService;

    @GetMapping("/coupons")
    public R test() {
    MemberEntity memberEntity = new MemberEntity();
    memberEntity.setNickname("张三");
    R list = couponFeignService.list();

    return R.ok().put("member", memberEntity).put("coupons", list);
    }
  6. 重启gulimall-membergulimall-coupon服务

  7. 访问API进行测试

    成功获取到数据,远程调用API成功

Nacos Config 配置中心

使用Spring Cloud Alibaba Nacos作为配置中心。

默认Nacos已经安装并运行。

简单使用

  1. 引入依赖

    1
    2
    3
    4
    <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    </dependency>
  2. 添加bootstrap.properties配置文件

    1
    2
    spring.application.name=gulimall-coupon
    spring.cloud.nacos.config.server-addr=127.0.0.1:8848
  3. 在Nacos的配置文件中添加gulimall-coupon.properties配置文件,内容如下

    1
    2
    coupon.user.name=zhangsan
    coupon.user.age=19
  4. 编辑测试的API

    1
    2
    3
    4
    5
    6
    7
    8
    9
    @Value("${coupon.user.name}")
    private String name;
    @Value("${coupon.user.age}")
    private Integer age;

    @GetMapping("test")
    public R testConfig() {
    return R.ok().put("name", name).put("age", age);
    }
  5. 在使用配置文件中的配置的类上加入@RefreshScope注解

  6. 重启服务并调用API测试,若成功再修改配置中心的配置文件中的值再次调用查看是否变化

多配置文件

将已有的application.yml拆分为多个配置文件,如:

coupon-other.yml:管理coupon专属配置

mybatis.yml:管理mybatis相关配置

datasource.yml:管理数据库连接相关配置

只需要修改bootstrap.yml(用bootstrap.properties也行,我习惯使用yaml格式)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
spring:
application:
name: gulimall-coupon
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
ext-config:
- data-id: coupon-other.yml
group: DEFAULT_GROUP
refresh: true
- data-id: mybatis.yml
group: DEFAULT_GROUP
refresh: true
- data-id: datasource.yml
group: DEFAULT_GROUP
refresh: true

Spring Cloud Gateway

Spring Cloud提供的API网关:Spring Cloud Gateway

  1. 创建Module子工程,名称为gulimall-gateway

  2. pom.xml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.8.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.imxushuai.gulimall</groupId>
    <artifactId>gulimall-gateway</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>gulimall-gateway</name>
    <description>谷粒商城-网关服务</description>
    <properties>
    <java.version>1.8</java.version>
    <spring-cloud.version>Greenwich.SR5</spring-cloud.version>
    </properties>
    <dependencies>
    <dependency>
    <groupId>com.imxushuai.gulimall</groupId>
    <artifactId>gulimall-common</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
    </dependency>

    <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
    </dependency>
    </dependencies>
    <dependencyManagement>
    <dependencies>
    <dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>${spring-cloud.version}</version>
    <type>pom</type>
    <scope>import</scope>
    </dependency>
    </dependencies>
    </dependencyManagement>

    <build>
    <plugins>
    <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    </plugin>
    </plugins>
    </build>

    </project>
  3. 启动类

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    package com.imxushuai.gulimall.gulimallgateway;

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;

    @EnableDiscoveryClient
    @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
    public class GulimallGatewayApplication {

    public static void main(String[] args) {
    SpringApplication.run(GulimallGatewayApplication.class, args);
    }

    }
  4. application.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    spring:
    cloud:
    nacos:
    discovery:
    server-addr: 127.0.0.1:8848
    application:
    name: gulimall-gateway
    server:
    port: 88
  5. bootstrap.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    spring:
    cloud:
    nacos:
    config:
    server-addr: 127.0.0.1:8848
    # 命名空间ID, 根据具体ID替换
    namespace: cad8d252-b4a6-4634-9ef2-5e963d361395
    ext-config:
    - data-id: routing.yml
    group: DEFAULT_GROUP
    refresh: true
  6. 在Nacos配置中心配置routing.yml

    需要提前创建gateway使用的配置中心命名空间

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    spring:
    cloud:
    gateway:
    routes:
    - id: baidu_route
    uri: https://www.baidu.com
    predicates:
    - Query=url, baidu
    - id: qq_route
    uri: https://www.qq.com/
    predicates:
    - Query=url, qq
  7. 启动并访问测试

    测试地址1:http://localhost:88/?url=baidu

    测试地址2:http://localhost:88/?url=qq

前端基础开发与入门

ES6和VUE,大致的内容我都会,所以这里就不写笔记了,用的时候能搜到就行了。

文章作者: imxushuai
文章链接: https://www.imxushuai.com/2021/12/14/42.谷粒商城-分布式基础-02/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 imxushuai
支付宝打赏
微信打赏