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);}