SpringCloud学习笔记

SpringCloud笔记

项目结构

聚合项目没有代码,删除pom.xml内的properties,dependencies,dependencyManagement,build等标签。设置<packaging>pom</packaging>。设置主项目groupId。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?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>
<groupId>cn.nicenan.mahumall</groupId>
<artifactId>mahumall</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>mahumall</name>
<description>聚合</description>
<packaging>pom</packaging>
<modules>
<module>common</module>
<module>gateway</module>
</modules>
</project>

再使用Spring Initializr分别创建微服务模块,groupId(组)设置为聚合项目的groupId.xxxxxx为项目名。

聚合项目的modules标签添加创建的微服务模块。微服务模块设置服务注册,配置中心等。

可以将共同依赖和用到的类抽离到common模块,设置各个微服务模块再依赖common模块。

Nacos 服务注册 配置中心

依赖添加和配置

查看commit

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
<dependencies> 
<!-- 服务注册发现 俩依赖都要.因为ribbon不再维护换用loadbalancer-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
<version>3.0.3</version>
</dependency>

<!-- 配置中心来做配置管理 俩依赖都要-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>3.0.3</version>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

服务注册

启动类加上@EnableDiscoveryClient注解

application.yml中配置nacos server的地址,并且指定application.name

1
2
3
4
5
6
spring:
cloud:
nacos:
server-addr: 192.168.2.211:8848
application:
name: mahumall-coupon

配置中心

使用Nacos作为配置中心统一管理配置

  1. 引入依赖 文档

  2. 创建bootstrap.properties文件,这是springboot的文件,配置应用名字和Nacos Server地址

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    spring.application.name=mahumall-third-party
    spring.cloud.nacos.config.server-addr=192.168.2.211:8848
    #命名空间
    spring.cloud.nacos.config.namespace=c31fdda6-b467-42bf-a5d6-83f7e59fa719
    #配置分组
    spring.cloud.nacos.config.group=DEFAULT_GROUP
    #多配置
    spring.cloud.nacos.config.extension-configs[0].data-id=oss.yml
    spring.cloud.nacos.config.extension-configs[0].group=DEFAULT_GROUP
    spring.cloud.nacos.config.extension-configs[0].refresh=true
  3. 进入Nacos Server的配置中心,新建配置。Data ID一定是 xxx.properties。xxx是应用名字。默认规则 应用名.properties

  4. 添加任意配置

  5. 动态获取配置,使用两个注解@RefreshScope@Value("${配置项名字}")。优先使用配置中心内的值

细节

  1. 命名空间 配置隔离。默认public(保留空间)。默认新增的配置都在public空间内。bootstrap.properties里面设置spring.cloud.nacos.config.namespace
    可以设置开发,测试,生产命名空间。推荐:也可以每一个微服务之间项目隔离配置,每个微服务创建自己的命名空间(直接用微服务的名字),只加载自己命名空间的配置,利用分组切换环境。

  2. 配置集 所有配置的集合

  3. 配置集id 类似配置的文件名,就是Data ID。 应用名字.properties

  4. 配置分组 所有的配置集都输入:DEFAULT_GROUP组 。组可以自己随便输。

  5. 加载多个配置文件。

    1
    2
    3
    spring.cloud.nacos.config.extension-configs[0].data-id="xxx.yml"
    spring.cloud.nacos.config.extension-configs[0].group="dev"
    spring.cloud.nacos.config.extension-configs[0].refresh=true

推荐用法

  1. 每个微服务创建自己的命名空间,创建Data ID,使用配置分组区分环境(dev,test,prod)。
  2. 在bootstrap.properties指定命名空间和分组
  3. 以前springboot任何方式从配置文件中获取值都能用(@Value,@ConfigurationProperties等),优先使用配置中心的值。

Openfeign 远程调用

Nacos 测试远程调用

添加依赖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

用法

  1. 引入open-feign

  2. 编写接口(feign包),告诉SpringCloud这个接口需要调用远程服务

  3. 接口加上注解@FeignClient("mahumall-coupon") mahumall-coupon是服务的名字(用Nacos注册)

  4. 接口里添加复制的方法签名,需要补全RequestMapping整个路径

  5. 开启远程调用功能,启动类注解@EnableFeignClients(basePackages = "cn.nicenan.mahumall.member.feign") 自动扫描

  6. MemberController写一个测试请求 public R test();

  7. SpringCloud新版本需要在Common中排除Ribbon依赖,微服务模块添加loadbalancer依赖 https://blog.csdn.net/weixin_43556636/article/details/110653989

    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
    //另一个微服务的controller
    @RestController
    @RequestMapping("coupon/coupon")
    public class CouponController {
    @RequestMapping("/member/list")
    public R memberCoupons() {
    CouponEntity couponEntity = new CouponEntity();
    couponEntity.setCouponName("满99减20");
    return R.ok().put("coupons", List.of(couponEntity));
    }
    }
    //远程调用的接口
    @FeignClient("mahumall-coupon")
    public interface CouponFeignService {
    @RequestMapping("/coupon/coupon/member/list")
    public R memberCoupons();
    }
    //使用远程调用
    @RestController
    @RequestMapping("member/member")
    public class MemberController {
    @Autowired
    CouponFeignService couponFeignService;

    @RequestMapping("/coupons")
    public R test() {
    R memberCoupons = couponFeignService.memberCoupons();
    return R.ok().put("coupons", memberCoupons.get("coupons"));
    }
    }

Gateway 网关

  1. 添加依赖
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2020.0.3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
  1. 配置Nacos服务注册和配置中心
  2. application.yml内配置路由规则

路由规则

按yml内从上到下匹配。

1
2
3
4
5
6
7
8
9
10
11
12
spring:
cloud:
gateway:
routes:
- id: nicenan_route
uri: https://www.nicenan.cn
predicates:
- Query=url,nicenan
- id: qq_route
uri: https://www.qq.com
predicates:
- Query=url,qq

统一跨域处理

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@Configuration
public class MahumallCorsConfiguration {
@Bean
public CorsWebFilter corsWebFilter(){
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
corsConfiguration.addAllowedOriginPattern("*");
corsConfiguration.setAllowCredentials(true);
source.registerCorsConfiguration("/**",corsConfiguration );
return new CorsWebFilter(source);
}
}