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.3 nacos 注册中心

1.3.1 引入依赖

在common模块里引入

 <dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
 </dependency>

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

还要设置服务名称

spring.application.name=gulimall-coupon

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

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

@SpringBootApplication
@EnableDiscoveryClient
public class GulimallCouponApplication {

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

}

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));
}

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

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

    // 告诉springcloud要调用该服务的哪个方法
    @RequestMapping("coupon/coupon/member/list")
    public R memberCoupons();
}

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"));
}

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);
    }

}

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>

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.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>

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

spring:
  application:
    name: gulimall-coupon
  cloud:
    nacos:
      config:
        server-addr: localhost:8848

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);
}

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

1.5.5 动态刷新配置

在CouponController类上标注@RefreshScope

1.5.6 命名空间

一般创建方法:

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

配置格式:

spring.cloud.nacos.config.namespace=xxx

1.5.7 group

配置格式:

spring.cloud.nacos.config,group=xxx

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

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);
    }

}

2、配置nacos地址,application.properties

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

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

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

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

7、启动主程序类

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

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值