当前位置:   article > 正文

3.分布式组件篇

分布式组件

1 spring cloud alibaba

1.1 简介

spring cloud alibaba的github地址:https://github.com/alibaba/spring-cloud-alibaba

1.2 引入依赖

在common模块里引入依赖

对应版本:

  • 1.5.x 版本适用于 Spring Boot 1.5.x
  • 2.0.x 版本适用于 Spring Boot 2.0.x
  • 2.1.x 版本适用于 Spring Boot 2.1.x
  • 2.2.x 版本适用于 Spring Boot 2.2.x
  • 2020.x 版本适用于 Spring Boot 2.4.x
  • 2021.x 版本适用于 Spring Boot 2.6.x
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>2021.0.1.0</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

1.3 nacos 注册中心

1.3.1 引入依赖

在common模块里引入

 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>
  • 1
  • 2
  • 3
  • 4

1.3.2 下载nacos

Nacos Server 下载页

安装在windows上

双击bin目录里的startup.cmd即可启动服务

输入http://localhost:8848/nacos/进入nacos页面

默认用户名密码都是nacos

1.3.3 配置nacos地址

在gulimall-coupon里配置nacos的地址

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
  • 1

还要设置服务名称

spring.application.name=gulimall-coupon
  • 1

1.3.4 开启服务注册与发现功能

使用 @EnableDiscoveryClient 注解开启服务注册与发现功能

@SpringBootApplication
@EnableDiscoveryClient
public class GulimallCouponApplication {

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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

1.3.5 启动gulimall-coupon

启动gulimall-coupon,进入nacos页面查看服务是否注册成功

image-20220419144342676

1.3.6 注册剩余服务

将其他几个服务按照同样的方法进行注册

1、修改application.yml

2、添加@EnableDiscoveryClient注解

1.4 openfeign

1.4.1 引入依赖

之前已经引入了

1.4.2 远程调用步骤

  1. 引入openfeign
  2. 编写一个接口,告诉springcloud这个接口要调用远程服务
    1. 声明接口的方法是调用哪个远程服务的哪个请求
  3. 开启远程调用功能:@EnableFeignClients

1.4.2 远程调用实现

1、在coupon模块的CouponController.java下编写一个controller

@RequestMapping("/member/list")
public R memberCoupons() {
    CouponEntity couponEntity = new CouponEntity();
    couponEntity.setCouponName("满100减10");
    return R.ok().put("coupons", Arrays.asList(couponEntity));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2、在member模块下创建一个feign.CouponFeignService.java接口

@FeignClient("gulimall-coupon") // 告诉springcloud要调用哪个服务
public interface CouponFeignService {

    // 告诉springcloud要调用该服务的哪个方法
    @RequestMapping("coupon/coupon/member/list")
    public R memberCoupons();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

3、在member的MemberController.java里创建测试方法

@Autowired
CouponFeignService couponFeignService;

@RequestMapping("/coupons")
public R test() {
    MemberEntity memberEntity = new MemberEntity();
    memberEntity.setNickname("张三");
    R memberCoupons = couponFeignService.memberCoupons();
    return R.ok().put("member", memberEntity).put("coupons", memberCoupons.get("coupons"));
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

4、在member模块的主启动类上标注注解

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign")
public class GulimallMemberApplication {

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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

5、重新启动member和coupon服务

坑:member服务启动报错No Feign Client for loadBalancing defined. Did you forget to include spring-cloud-starter-loadbalancer?

问题原因:

由于Spring Cloud Feign在Hoxton.M2 RELEASED版本之后不再使用Ribbon而是使用spring-cloud-loadbalancer,所以不引入spring-cloud-loadbalancer会报错.

解决方法:

加入spring-cloud-loadbalancer依赖 并且在nacos中排除ribbon依赖,不然loadbalancer无效

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <exclusions>
        <exclusion>
            <groupId>com.netflix.ribbon</groupId>
            <artifactId>ribbon</artifactId>
        </exclusion>
    </exclusions>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-loadbalancer</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

6、浏览器输入http://localhost:8000/member/member/coupons,看到JSON串则表示测试成功

1.5 nacos 配置中心

1.5.1 导入依赖

 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>
  • 1
  • 2
  • 3
  • 4

1.5.2 创建bootstrap.yml

坑:不知道是不是版本问题,写bootstrap.properties无法连接到nacos

解决方法:

1、在common添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
    <version>3.0.3</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

2、在coupon模块下编写bootstrap.yml

spring:
  application:
    name: gulimall-coupon
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

1.5.3 新建nacos配置

image-20220419152515901

1.5.4 编写测试controller

@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.age}")
private String age;

@GetMapping("/test")
public R test() {
    return R.ok().put("name", name).put("age", age);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

coupon.user.name和coupon.user.age是从nacos上获取的

1.5.5 动态刷新配置

在CouponController类上标注@RefreshScope

1.5.6 命名空间

一般创建方法:

  1. 开发、测试、生产来命名
  2. 以每一个微服务的名称来命名

配置格式:

spring.cloud.nacos.config.namespace=xxx
  • 1

1.5.7 group

配置格式:

spring.cloud.nacos.config,group=xxx
  • 1

1.5.8 配置分类方法

每一个微服务创建自己的命名空间,使用group区分环境(test、dev、prod)

1.5.9 多配置集

把不同类型的配置区分开来,放到不同的文件中

1、数据源配置(命名空间:gulimall-coupon)

image-20220419162925650

2、mybatis配置

image-20220419162908008

3、其他配置

image-20220419162935980

4、修改bootstrap.yml

spring:
  application:
    name: gulimall-coupon
  cloud:
    nacos:
      config:
        server-addr: 127.0.0.1:8848
        namespace: d658a478-b874-4c7a-a9c0-5a7548a3034e
        group: dev
        extension-configs:
          - dataId: datasource.yaml
            group: dev
            # 动态刷新
            refresh: true
          - dataId: mybatis.yaml
            group: dev
            # 动态刷新
            refresh: true
          - dataId: other.yaml
            group: dev
            # 动态刷新
            refresh: true
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

5、现在可以注释掉application.yml里的所有内容,启动coupon服务,输入网址http://localhost:7000/coupon/coupon/test进行测试

1.6 gateway

1.6.1 新建gatewat模块

导入gateway依赖

依赖common模块

image-20220419202422808

1.6.2 配置

1、开启服务注册发现,添加@EnableDiscoveryClient,并排除DataSource相关配置

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

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

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

2、配置nacos地址,application.properties

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88
  • 1
  • 2
  • 3

3、在nacos里新建命名空间gateway

4、新建配置

image-20220419203420405

5、配置bootstrap.yml

spring:
  application:
    name: gulimall-gateway
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        namespace: bfe5c423-248e-4d55-89f9-56b4e2aa75d4
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

6、配置网关逻辑,application.yml

spring:
  cloud:
    gateway:
      routes:
        - id: baidu_route
          uri: https://www.baidu.com
          predicates:
            - Query=url, baidu # 如果参数url的值为baidu,则页面跳转至https://www.baidu.com
        - id: qq_route
          uri: https://www.qq.com
          predicates:
            - Query=url, qq
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

7、启动主程序类

8、浏览器输入http://localhost:88/?url=qq观察到页面跳转至腾讯网
application.yml

spring:
  cloud:
    gateway:
      routes:
        - id: baidu_route
          uri: https://www.baidu.com
          predicates:
            - Query=url, baidu # 如果参数url的值为baidu,则页面跳转至https://www.baidu.com
        - id: qq_route
          uri: https://www.qq.com
          predicates:
            - Query=url, qq
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

7、启动主程序类

8、浏览器输入http://localhost:88/?url=qq观察到页面跳转至腾讯网

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/523939
推荐阅读
相关标签
  

闽ICP备14008679号