一、Nacos的使用
1、 正常使用http客户端调用
我们下订单的时候的调用:
1、讲解单独调用的图 2、然后运行一下这个demo 3、提出问题 4、进行改造
2、引入nacos
改造msb-stock
1、父pom引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2、启动注解
@EnableDiscoveryClient
@SpringBootApplication
public class StockApplication {
public static void main(String[] args) {
SpringApplication.run(StockApplication.class);
}
}
3、增加配置
spring:
cloud:
nacos:
discovery:
service: msb-stock
server-addr: localhost:8848
改造msb-order
2、启动注解:
@EnableDiscoveryClient
@SpringBootApplication
public class OrderApplication {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class);
}
}
3、增加配置
spring:
cloud:
nacos:
discovery:
service: msb-order
server-addr: localhost:8848
4、改造代码:
@GetMapping("/order/create")
public String createOrder(Integer productId,Integer userId){
String result = restTemplate.getForObject("http://msb-stock/stock/reduce//" + productId, String.class);
return "下单成功";
}
5、现在我们访问msb-stock ,但是restTemplate并不知道怎样调用
@GetMapping("/order/create")
public String createOrder(Integer productId,Integer userId){
// 此时restTemplate并不能识别msb-stock所以他不能进行调用
// RestTempLate调用需要一个负载均衡器 1、 获取msb-stock对应服务列表 2、选择一个去调用
// RestTemplate扩展点clientHttpRequestInterceptor
// 我们有个组件ribbon 实现了这个扩展点 LoadBalancerInterceptor
// 他做的事情就是将msb-stock:替换为:localhost:11001
String result = restTemplate.getForObject("http://msb-stock/stock/reduce//" + productId, String.class);
return "下单成功";
}
分析一下LoadBalancerInterceptor的拦截器Interceptor
我们可以进行如下改造:
@Autowired
LoadBalancerClient loadBalancerClient;
@Bean
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
restTemplate.setInterceptors(Collections.singletonList(new LoadBalancerInterceptor(loadBalancerClient)));
return restTemplate;
}
当然我们也可以进行如下改造:直接加入注解@LoadBalance后面我们会讲
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
二、Nacos注册中心的原理
首先服务在启动的时候会将数据注册到注册中心,这样就服务只要启动就可以对外提供服务了, 那么同时他也要维持一个心跳,心跳的意义就是某个服务挂掉,我肯定让注册中心知道,如果服务挂了还没有告诉注册中心,那么注册中心会引导客户端调用挂掉的服务体验就不好了,所以注册中心重要的概念就是和我们的服务维持一个心跳,来实时的监听我们服务的状态,当服务挂掉就会将其从服务列表中踢掉,接下来肯定还有服务的调用者,他在调用服务之前一定会到注册中心拉取服务列表,获取可用的服务,并且还有一个定时任务来定时拉取服务列表,以保持服务列表的最新状态,其次还有更新的功能,这个功能就是当服务挂掉的时候通过心跳他会发现这服务不健康了,他会更新本地的服务注册表,同时将所有订阅这个注册表的服务进行更新。
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第13天,点击查看活动详情