注册中心,配置中心,网关
Spring Cloud Alibaba
Nacos
可以当做注册中心,也可以当成是配置中心。参考
https://github.com/alibaba/spring-cloud-alibaba/blob/2022.x/spring-cloud-alibaba-examples/nacos-example/nacos-config-example/readme-zh.md
启动Nacos
bash startup.sh -m standalone
随后在需要注册到Nacos的微服务的配置文件中,添加如nacos 的注册地址
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
老版本有一个注解,但是高版本的nacos注解也不需要了。
地址是:localhost:8848/nacos。账户密码都是nacos
远程调用
想要远程调用,第一步就要引入openfeign,编写一个接口,这个接口需要调用远程服务。
@FeignClient("gulimall-coupon")
public interface CouponFeignService {
@RequestMapping("coupon/coupon/member/list")
public R memberCoupons();
}
Spring Boot版本高了,遇到这个问题
https://www.cnblogs.com/yiMro/p/16018149.html
只有在nacos注册中心中有的微服务,才能够用Feign调用成功。Feign本质上是一个Http链接的工具。
调用的时候就比较容易了
@Autowired
private CouponFeignService couponFeignService;
@RequestMapping("/coupons")
public R test() {
MemberEntity memberEntity = new MemberEntity();
memberEntity.setNickname("张三");
R r = couponFeignService.memberCoupons();
return R.ok().put("member", memberEntity).put("coupos", r.get("coupons"));
}
Nacos作为配置中心
操作流程
添加文件 bootstrap.properties (与github不同,但是官网上是这么写的)
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=gulimall-coupon
在common的pom里,加上,否则动态刷新不起作用。
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bootstrap</artifactId>
<version>4.0.1</version>
</dependency>
在微服务的controller中添加
@Value("${coupon.user.name}")
private String name;
@Value("${coupon.user.pass}")
private String password;
@RequestMapping("/member/test")
public R test() {
return R.ok().put("name",name).put("age", password);
}
动态刷新需要在Controller类上添加 @RefreshScope 注解
类似于${coupon.user.pass} 这些数据,需要在Nacos的网页上进行配置。
如果本地与Nacos配置中心都配置了相同的项目,那么优先使用Nacos的内容。
更多细节
- 命名空间
用来做配置隔离的,这个可以在网页控制台看到。默认是public,新增的所有配置,都是在public空间下。
配置隔离可以分为:开发,线上,生产环境等等。默认使用public配置,需要更改,在bootstrap.properties中更改。在控制台新增命名空间,然后创建同名配置,在bootstrap.properties更换需要对应的uuid
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=gulimall-coupon
spring.cloud.nacos.config.namespace=f3aa3786-54af-4dfd-9658-6b4e4144dbb8
另外,也可以根据不同的微服务,创建不同的命名空间。
-
配置集:所有的配置的集合,例如application.yml
-
配置ID:类似于文件名,就是nacos中的DataID
-
配置分组:默认所有的配置集都属于DEFAUL_GROUP。比如双十一用这样的配置,618用那样的配置。创建配置的时候,有创建组的选项。本地上在bootstrap.properties切换不同的组。
在谷粒商城中,每个微服务创建不同的命名空间,使用配置分组来区分环境(dev,test,prod)
使用Nacos的目的,就是为了不在项目中再次配置。
所有微服务的配置文件,都可以放在配置中心中。我们只需要在bootstrap.properties说明加载配置中心哪些配置文件即可。
可以使用 @Value,@ConfigurationProperties 等以前SpringBoot 任何方法都能获取值,都能使用,并且nacos的优先级高。
Gateway
网关帮我们分流,将请求正确的路由到指定位置。过滤,限流等等。
Client 请求 GateWay ,然后分流。我们使用Spring Cloud 的Gateway,这里每秒请求数量大约为三万左右。
- Route:路由匹配断言(Java8中的新增的函数接口 Predicate)。我们请求发给API,路由匹配为true后才成功。
- Filter 过滤器。
创建一个Module,使用SPring Initlizatier,pom里引入gulimall-common,但是因为common中有mybatis-plus相关的内容,因此需要排除,在主类中修改
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
配置相关:
application.yml
spring:
cloud:
gateway:
routes:
- id: test_route
uri:
http://www.baidu.com
predicates:
- Query=url,baidu
- id: qq_route
uri:
http://www.qq.com
predicates:
- Query=url,qq
server:
port: 8539
配置boostrap.properties(但是似乎没有起效果)
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=5fe8953a-c7a9-4431-bd3d-dfc501ad0d64
spring.application.name=gulimall-gateway
记得在主类中加入 @EnableDiscoveryClient 注解