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 {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
- 注入配置类
@Resource RestTemplate restTemplate
- 使用
// 3、拼接远程URL
String 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、choose
ServiceInstance choose = loadBalancerClient.choose("service-product");
// 2、拼接远程URL
String 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
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
- 使用
private Product getProductFromRemoteWithAno(Long productId)
{
// 1、拼接远程URL
String url = "http://service-product/product/"+productId;
System.out.println(url);
// 2、给远程发请求
return restTemplate.getForObject(url, Product.class);
}