环境以及版本说明
工具 | 版本 |
JDK | 1.8.0_301 |
MySQL | 5.7.36 |
IDEA | 2021.3.3 |
Maven | 3.8.5 |
SpringBoot | 2.7.1 |
SpringCloud | 2021.0.3 |
MyBatis-Plus | 3.2.0 |
Docker | 20.10.17 |
Nacos | 1.2.1 |
0、启动Nacos Server
访问Nacos首页:http://localhost:8848/nacos/#/login
登录默认账户和密码:nacos
1、如何使用Nacos作为注册中心
1.1)引入nacos-config依赖
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
1.2) application.yml配置
在 application.yml
中配置 Nacos server 的地址和应用名
spring: datasource: username: root password: root url: jdbc:mysql://192.168.10.129:3306/gulimall_sms?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai driver-class-name: com.mysql.cj.jdbc.Driver cloud: nacos: discovery: server-addr: 127.0.0.1:8848 application: name: gulimall-coupon mybatis-plus: mapper-locations: classpath:/mapper/**/*.xml global-config: db-config: id-type: auto server: port: 7000
1.3)将服务注册进nacos server中
使用注解@EnableDiscoveryClient
检查Nacos Server发现注册进来了
1.4)OpenFeign申明式远程服务调用
目的:让会员服务远程调用优惠券服务
想要远程调用别的服务
1)引入OpenFeign依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
2)编写一个接口,告诉SpringCloud这个接口需要调用远程服务
/** * 这是一个声明式的远程调用 */ @FeignClient(name = "gulimall-coupon") public interface CouponFeignService { @RequestMapping("/coupon/coupon/member/list") public R membercoupons(); }
声明接口的每一个方法都是调用哪个远程服务的那个请求
3)开启远程调用功能
@EnableFeignClients(basePackages = "com.atguigu.gulimall.member.feign") @EnableDiscoveryClient @SpringBootApplication public class GulimallMemberApplication { public static void main(String[] args) { SpringApplication.run(GulimallMemberApplication.class, args); } }
坑:
这里启动失败了,报错是LoadBalance出错
解决办法:需要引入spring-cloud-loadbalancer依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-loadbalancer</artifactId> <version>2.2.2.RELEASE</version> </dependency>
2、如何使用Nacos作为配置中心
2.1)引入nacos-config依赖
<!-- 配置中心来做配置管理--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
2.2)创建 bootstrap.properties 并在其中配置 Nacos server 的地址和应用名
spring.application.name=gulimall-coupon spring.cloud.nacos.config.server-addr=127.0.0.1:8848
写一个Controller方法
@RequestMapping("coupon/coupon") public class CouponController { @Autowired private CouponService couponService; @Value("${coupon.user.name}") private String name; @Value("${coupon.user.age}") private Integer age; @RequestMapping("/test") public R test(){ return R.ok().put("name",name).put("age",age); }
访问http://localhost:7000/coupon/coupon/test
发现读取的是系统变量的名字,并没有读取到我们在application.propertoes
中设置的
user.name=zhangsan2 user.age=20
注意:
要写上模块的前缀名coupon,才能读取到
coupon.user.name=zhangsan2 coupon.user.age=20
但是每次如果要修改配置就要去application.propertoes
中设置,这是很不方便的。因为微服务还要重启,这在生产中是不能接受的,所以我们采用Nacos来做统一的配置管理中心
2.3)需要给配置中心默认添加一个叫 数据集(Data Id)gulimall-coupon.properties。默认规则,应用名.properties
并给 应用名.properties 添加配置
2.4)动态获取配置。
使用注解:@RefreshScope
:动态获取并刷新配置
@RefreshScope @RestController @RequestMapping("coupon/coupon") public class CouponController { @Autowired private CouponService couponService; @Value("${coupon.user.name}") private String name; @Value("${coupon.user.age}") private Integer age; @RequestMapping("/test") public R test(){ return R.ok().put("name",name).put("age",age); }
注意:
@Value(“${配置项的名}”):获取到配置。
如果配置中心和当前应用的配置文件中都配置了相同的项,优先使用配置中心的配置。
2.5) 细粒度管理Nacos配置中心
2.5.1)命名空间:配置隔离;
默认:public(保留空间);默认新增的所有配置都在public空间。
1、开发,测试,生产:利用命名空间来做环境隔离。
启动微服务后发现系统会默认使用public下的gulimall-coupon.properties
文件
如果想要读取指定的命名空间下的gulimall-coupon.properties
文件,那就需要在
注意:在bootstrap.properties;配置上,需要使用哪个命名空间下的配置,
spring.cloud.nacos.config.namespace=9de62e44-cd2a-4a82-bf5c-95878bd5e871
2.5.2) 每一个微服务之间互相隔离配置,每一个微服务都创建自己的命名空间,只加载自己命名空间下的所有配置
2.5.3)配置分组:
默认所有的配置集都属于:DEFAULT_GROUP;
项目中的使用:每个微服务创建自己的命名空间,使用配置分组区分环境,dev,test,prod
2.5.4)同时加载多个配置集
- 1)、微服务任何配置信息,任何配置文件都可以放在配置中心中
- 2)、只需要在bootstrap.properties说明加载配置中心中哪些配置文件即可
spring.application.name=gulimall-coupon spring.cloud.nacos.config.server-addr=127.0.0.1:8848 spring.cloud.nacos.config.namespace=c57909ca-177f-4817-b4b6-17707f4c2237 spring.cloud.nacos.config.group=dev spring.cloud.nacos.config.ext-config[0].data-id=datasource.yml spring.cloud.nacos.config.ext-config[0].group=dev spring.cloud.nacos.config.ext-config[0].refresh=true spring.cloud.nacos.config.ext-config[1].data-id=mybatis.yml spring.cloud.nacos.config.ext-config[1].group=dev spring.cloud.nacos.config.ext-config[1].refresh=true spring.cloud.nacos.config.ext-config[2].data-id=other.yml spring.cloud.nacos.config.ext-config[2].group=dev spring.cloud.nacos.config.ext-config[2].refresh=true
- 3)、@Value,@ConfigurationProperties。。。
- 以前SpringBoot任何方法从配置文件中获取值,都能使用。
- 配置中心有的优先使用配置中心中的,
2.6)启动服务发现示例图
3)Gateway网关路由
三大组件:路由(Router)、断言(Predicate)、过滤(Filter)
3.1)工作流程图
3.1.1)引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
3.1.2)开启服务注册发现
配置nacos的注册中心地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 spring.application.name=gulimall-gateway server.port=88
3.2)在Nacos Server里注册网关
3.3)配置网关
3.4)编写application.yml配置文件进行路由转发
spring: cloud: gateway: routes: - id: test_route uri: https://www.baidu.com predicates: - Query=url,baidu - id: qq_route uri: https://www.qq.com predicates: - Query=url,qq
3.5)启动网关微服务,测试是否能转发请求到指定网页
访问:http://localhost:88/?url=qq
发现成功
访问:http://localhost:88/?url=baidu
发现也是成功的
至此:
Spring Cloud Alibaba整合 Nacos配置注册中心和Gateway网关路由成功