我安装的是window版,可参照该教程nacos安装教程
com.alibaba.cloud spring-cloud-alibaba-dependencies 2.2.1.RELEASE pom import org.springframework.cloud spring-cloud-dependencies Hoxton.SR6 pom import
org.springframework.boot spring-boot-starter org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery org.springframework.boot spring-boot-test org.apache.httpcomponents httpclient 4.5.3 com.fasterxml.jackson.core jackson-core 2.11.1 com.fasterxml.jackson.core jackson-annotations 2.11.1 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-config org.springframework.cloud spring-cloud-starter-openfeign 2.1.3.RELEASE
对应的服务,需要注册在Nacos注册中心里。所以在application中进行配置。
在生产者和消费者中都加入该配置
#nacos配置 采用分级存储模型,将同一个机房中的实例化为一个集群
spring:cloud:nacos:server-addr: xxx.xx.xx.xxx:8848discovery:cluster-name: SZapplication:name: publisher
并在消费者的启动类上添加 @EnableDiscoveryClient注解
至此配置就完成了。
各个服务之间是通过Http请求来进行交互,原先使用RestTemplate进行请求,可以使用更方便的openFeign(Feign已经停止维护,可以看此篇文章)
引入依赖放到common包下
进行配置 feign底层用的HttpUrlConnect进行发送请求,可以更换为Okhttp,效率更高
feign:client:config:default:connectTimeout: 5000readTimeout: 5000loggerLevel: basicokhttp:enabled: truehystrix:enabled: true
开启Fegin 在springboot启动类上添加 @EnableFeignClients
发送请求。在消费者服务里建一个接口,写上需要调用的请求,并在接口上添加@FeignClient(name = "publisher" ,path="/order")
name为请求服务的服务名,path为路径前缀
@FeignClient(name = "publisher" ,path="/order")
public interface OrderFegin {@RequestMapping("/test/all")Object allOrders();@RequestMapping("/test/getOrder/{id}")Object getOrder(@PathVariable("id") String id);
}
在colntroller中注入Feign接口,便可使用
@RestController
@RequestMapping("/order")
public class OrderController {@Autowiredprivate OrderFegin orderFegin;@RequestMapping("/all")public Object getAllOrder(){HashMap map = new HashMap<>();map.put("order",orderFegin.allOrders());return map;}@RequestMapping("/all/{id}")public Object getAllOrder(@PathVariable("id") String id){HashMap map = new HashMap<>();map.put("order",orderFegin.getOrder(id));return map;}
}
原理:通过指定的服务名,去注册中心查找对应的ip地址,然后去向目标发送请求
nacos默认引入了RIbbon
默认使用ZoneAvoidanceRule(ribbon默认的轮序规则,分集群,但并不能实现根据同集群优先来实现负载均衡)
可以自定义使用哪一个规则,推荐使用NacosRule,可以同集群优先
@Beanpublic IRule iRule(){return new NacosRule();}
如何配置属于哪个集群
#nacos配置 采用分级存储模型,将同一个机房中的实例化为一个集群
spring:cloud:nacos:server-addr: 172.30.61.51:8848discovery:cluster-name: SZ #集群配置
RIbbon原理
通过服务名在数据中心找到多个ip,然后通过负载均衡策略(可以通过实现Irlue来实现),来制定对应的实例ip。
2. 如何通过bootstrap拿到nacos对应的配置呢,会通过服务名+profile名+后缀名组成。(nacos中没有profile名,则对该服务所有环境都生效)
spring:application:name: publisher # 服务名称profiles:active: dev #开发环境,这里是devcloud:nacos:server-addr: 172.30.61.51:8848 # Nacos地址config:file-extension: yaml # 文件后缀名extension-configs: #多个微服务公用的配置文件- data-id: common.yaml
如何实现配置的热更新呢?
可以通过 @RefreshScope 或者 @ConfigurationProperties 来实现
还支持在nacos中设置优先级(1最大,0用不使用)
参考大佬博客