七天学会SpringCloud分布式微服务——03——Nacos远程调用
1、微服务项目配置类放在地方
配置类型 | 应放位置 | 说明 |
---|---|---|
通用配置类 (如:跨服务通用的拦截器、全局异常处理、统一响应体封装等) | 可放在一个**公共模块(common/config)**中,被各服务引入 | 实现代码复用,避免重复 |
服务专属配置类 (如:服务特有的 Feign 配置、服务自己的拦截器、服务的业务 Bean 配置) | 应该放在该微服务自己的模块中 | 遵循“高内聚,低耦合”原则,不污染其他服务 |
网关、注册中心、配置中心等基础服务的配置类 | 放在对应网关或中心服务模块 | 专责专属 |
2、Nacos注册中心宕机了,远程调用还能使用吗
- 如果调用过就可以,如果没有调用过就不可以
3、 远程调用的三种方式(以order微服务调用product为例)
3.1 首先就是要获取到service-product的微服务
- 引入依赖
<!-- Nacos服务发现 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency>
- 注入
@Resource DiscoveryClient discoveryClient
- 获取所有service-product微服务实例
// 1、获取product的所有ip+端口号,因为要远程调用了吗List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
3.2 如何发送调用呢
选择RestTemplate 或者 WebClient,这里使用前者
- 编写配置类:
@Configuration
public class AppConfig {@Beanpublic RestTemplate restTemplate() {return new RestTemplate();}
}
- 注入配置类
@Resource RestTemplate restTemplate
- 使用
// 3、拼接远程URLString url = "http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/product/"+productId;// 4、给远程发请求return restTemplate.getForObject(url, Product.class);
3.3 负载均衡的远程调用
- 引入依赖:
<!--负载均衡依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency></dependencies>
- 注入依赖
@Resource LoadBalancerClient loadBalancerClient;
- 使用
private Product getProductFromRemoteBalance(Long productId){// 1、chooseServiceInstance choose = loadBalancerClient.choose("service-product");// 2、拼接远程URLString url = "http://"+choose.getHost()+":"+choose.getPort()+"/product/"+productId;System.out.println(url);// 3、给远程发请求return restTemplate.getForObject(url, Product.class);}
3.4 负载均衡远程调用注解(推荐,不用获取服务了)
- 在远程调用配置类中加入注解
@LoadBalanced
@Configuration
public class ServiceConfig {/*远程调用自动负载均衡*/@LoadBalanced@Beanpublic RestTemplate restTemplate(){return new RestTemplate();}
}
- 使用
private Product getProductFromRemoteWithAno(Long productId){// 1、拼接远程URLString url = "http://service-product/product/"+productId;System.out.println(url);// 2、给远程发请求return restTemplate.getForObject(url, Product.class);}