SpringCloud基础使用及配置
文章目录
Nacos
Nacos server 启动
docker
docker run --name nacos -p 50000:8848 -p 9848:9848 -p 9849:9849 -e MODE=standalone -d nacos/nacos-server
注意:nacos默认cluster部署,单机部署时一定要改为standalone启动,否则外网访问不了dashboard
Nacos server windows启动
startup.cmd -m standalone
Nacos注册中心
代码使用
- 配置pom.xml
<!--SpringCloudAlibaba的版本管理,以后在dependency中引相关依赖就不用写版本号了-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.7.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<!--Alibaba Nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
- 配置application.yml
spring:
# Nacos服务发现地址
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
# 本服务名字,用于Nacos服务发现
application:
name: coupon
- 启动配置类添加@EnableDiscoveryClient注解
工作原理
- 加载依赖包后,通过@EnableDiscoveryClien开启Nacos client功能。
- spring会根据配置文件application.yml中的信息,将注册信息发送到Nacos server上,完成注册。
- 再通过访问Nacos server即可控制Nacos
Nacos配置中心
代码使用
- 配置pom.xml
<!--Alibaba Nacos配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--一定得引入bootstrap,否则配置中心不启动!!!-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--注意检查springcloud的版本管理-->
- 配置bootstrap.properties或yml文件
spring:
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
## 开发环境的命名空间(细粒度)
namespace: ff5599f6-3f49-42cb-9570-ef3607199725
### 默认配置文件(应用名.file_extention)的配置分组选择(粗粒度)
group: DEFAULT_GROUP
application:
name: coupon
- 需要读取配置文件的类,添加@RefreshScope注解,给需要读取配置文件的参数加上@Value(“${coupon.name}”)注解
- 在Nacos配置管理列表中更新配置文件
注意:如果配置中心和线下配置文件中都配置了相同的参数,优先使用配置中心的配置
其他
Nacos控制粒度:namespace>group>data id
- 命名空间创建规则
- 开发,生产,测试环境各一个
- 每个微服务各一个
- 配置分组
所有的配置文件默认归属于DEFAULT_GROUP,但是可以通过更改配置文件分组的方式实现批量配置文件替换,如日常一组,双11一组
-
批量加载配置文件
实际写代码通常会把一个配置文件拆成多个独立功能的配置文件,可以通过加载配置文件组(非配置分组功能,配置分组是在nacos server完成的,配置文件组的拆分是在线下完成的,两回事)的方式解决
spring: application: name: coupon cloud: nacos: discovery: server-addr: 127.0.0.1:8848 namespace: e4ad8d82-6ae6-49b6-8011-8907442bceb6 config: server-addr: 127.0.0.1:8848 file-extension: yml ## 开发环境的命名空间(细粒度) namespace: e4ad8d82-6ae6-49b6-8011-8907442bceb6 ### 默认配置文件(应用名.file_extention)的配置分组选择(粗粒度) ## group不能省略 group: dev ### 读取多配置文件 extension-configs[0]: data-id: datasource.yml group: dev refresh: true extension-configs[1]: data-id: mybatis.yml group: dev refresh: true
Nacos整合
在使用Nacos后,所有的配置文件都可以放在配置中心,只需要在bootstrap中声明配置中心及配置文件的信息即可
bootstrap.yml
spring:
# 本服务名字,用于Nacos注册中心注册和配置中心注册
application:
name: coupon
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
namespace: e4ad8d82-6ae6-49b6-8011-8907442bceb6
config:
server-addr: 127.0.0.1:8848
## 开发环境的命名空间(细粒度)
namespace: e4ad8d82-6ae6-49b6-8011-8907442bceb6
### 默认配置文件的配置分组选择(粗粒度)
group: DEFAULT_GROUP
### 线上能读取文件的后缀(除了这个后缀的文件,一概都读取不了)
file-extension: yml
踩坑
- 引入Nacos config一定要引入bootstrap,否则在springboot加载的时候,nacos只启动discovery,不会启动config
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
- 配置文件执行顺序
- 线上>线下
- 线下:后执行的会覆盖先执行的配置文件(执行顺序:yml>properties)
- 线上:由file-extension决定读取文件的后缀,可自定义,除此之外的后缀都不会被读取
openfeign
代码使用
- 配置pom.xml
<!--SpringCloud的版本管理,以后在dependency中引相关依赖就不用写版本号了-->
<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>
<!--openfeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
- 定义RPC接口
- 接口上:添加注解@FeignClient(“待调用Service”),告诉要调用哪个Service
- 接口里:添加Service相同的方法签名作为抽象方法,告诉要调用服务的哪个方法
- 主配置启动类:添加@EnableFeignClients(basePackages = “com.liu.gulimall.coupon.feign”),告诉对哪些类开启feign扫描
// 接口配置
@FeignClient("coupon")
public interface CouponFeignService {
@RequestMapping("/coupon/coupon/member/list")
public R memberCoupon();
}
// 配置启动类配置
@EnableFeignClients(basePackages = "com.liu.gulimall.member.feign")
@SpringBootApplication
public class MemberApplication {
public static void main(String[] args) {
SpringApplication.run(MemberApplication.class, args);
}
}
工作原理
- 加载依赖包后,通过@EnableFeignClients(basePackages = “com.liu.gulimall.member.feign”)开启openfeignt功能,并开启rpc组件(feign接口)发现。
- 通过@FeignClient(“coupon”)定义feign接口,添加与原方法相同的映射url和方法。
- url才是后续远程调用过程中真实的调用方式
- 方法保持与原方法相同,目的是为了保证数据类型,返回值类型等相同,保证编译时不报错
- 定义了feign接口相当于只是定义了一个方法,还需要在controller中进行调用。
存在意义
如果不通过RPC框架实现此功能,那只能手动在通过模拟get,post发送请求,并获取返回值包装,极其麻烦
Gateway
代码使用
- pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
</dependencies>
<!--版本管理,以后在dependency中引相关依赖就不用写版本号了-->
<dependencyManagement>
<dependencies>
<!--SpringCloud-->
<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>
- 主配置类添加@EnableDiscoveryClient注解
- application.yml中配置路由条件(参考https://cloud.tencent.com/developer/article/1403887)
spring:
cloud:
gateway:
routes:
- id: baidu_route
uri: https://www.baidu.com
predicates:
- Query=url,taobao
- id: bilibili_route
uri: https://www.bilibili.com
predicates:
- Query=url,bilibili
SpringCloud整合
-
Nacos与openfeign整合
由于SpringCloud Feign在Hoxton.M2 RELEASED版本之后不再使用Ribbon而是使用spring-cloud-loadbalancer,所以不引入spring-cloud-loadbalancer会报错,所以需要在项目中加入spring-cloud-loadbalancer依赖 并且在nacos中排除ribbon依赖,不然loadbalancer无效
参考:https://blog.csdn.net/weixin_43556636/article/details/110653989
<!--Alibaba Nacos修改-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<!--Alibaba Nacos和Feign整合,要排除ribbon,引入loadbalance-->
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--引入loadbalance-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>