前文地址:
001 SpringCloudAlibaba整合 - Nacos注冊配置中心、Sentinel流控、Zipkin鏈路追蹤、Admin監控
文章目錄
- 8.Feign遠程調用、loadbalancer負載均衡整合
- 1.OpenFeign整合
- 1.引入依賴
- 2.啟動類添加`@EnableFeignClients`注解
- 3.yml配置
- 4.日志配置
- 5.遠程調用測試
- 6.服務降級
- 7.重試配置,服務端異常捕獲
- 8.連接池配置
- 2.Loadbalancer負載均衡測試
- 1.復制客戶端
- 2.修改端口啟動
- 3.測試
- 4.修改負載均衡算法
8.Feign遠程調用、loadbalancer負載均衡整合
1.OpenFeign整合
1.引入依賴
注意:由于openfeign高版本使用loadbalancer負載均衡而不是ribbon,所以需要引入loadbalancer依賴排除ribbon,否則會報錯
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId>
</dependency>
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><exclusions><exclusion><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-ribbon</artifactId></exclusion></exclusions></dependency>
2.啟動類添加@EnableFeignClients
注解
3.yml配置
#由于feign高版本使用loadbalancer負載均衡,排除了ribbon,所以超時時間不能使用ribbon配置
feign:#開啟feign對sentinel支持sentinel:enabled: true#feign gzip壓縮配置compression:request:enabled: true# 配置壓縮的類型mime-types: text/xml,application/xml,application/json# 最小壓縮值min-request-size: 2048response:enabled: trueclient:config:#服務名稱cloud-production:# 連接超時時間connectTimeout: 90000# 請求處理超時時間readTimeout: 90000# default 全局配置,可以用服務名配置單個服務default:#日志級別,BASIC就是最基本的請求和響應信息loggerLevel: BASIC
springboot全局壓縮配置
server:# gzip壓縮配置compression:min-response-size: 512mime-types: application/json,application/xml,text/html,text/xml,text/plainexcluded-user-agents: gozilla,traviataenabled: true
4.日志配置
方式一
#日志收集
logging:#feign日志配置level:com.moshangshang.cloud.clean.feign.ProductionFeign: debug #掃描的是你那個service的類全類名,也可掃包
方式二
feign:client:config:default:#日志級別,BASIC就是最基本的請求和響應信息loggerLevel: BASIC
方式三
@Configuration
public class FeignConfig {/*** feign日志配置*/@Beanpublic Logger.Level feignLogLevel(){return Logger.Level.BASIC; // 日志級別為BASIC}}
單個遠程調用使用
@FeignClient(value = "cloud-production",configuration = FeignConfig.class)
全局使用
@EnableFeignClients(defaultConfiguration = FeignConfig.class)
5.遠程調用測試
1.fegin調用接口
@FeignClient(value = "cloud-production",configuration = FeignConfig.class)
public interface ProductionFeign {@GetMapping("/cloud-production/test1")String test1();}
2.調用方法
@RestController
@RequestMapping("/cloud-clean")
public class CleanController {@Autowiredprivate ProductionFeign productionFeign;@GetMapping("/test1")public void test1(){String s = productionFeign.test1();System.out.println("遠程調用接收到的數據"+s);}}
3.被調用服務方法
@RestController
@RequestMapping("/cloud-production")
public class ProductionController {@GetMapping("/test1")public String test1(){System.out.println("test1 被調用了");return "111";}}
4.測試結果
6.服務降級
1.編寫降級工廠類
/*** 服務降級*/
@Slf4j
@Component
public class ProductionFallbackFactory implements FallbackFactory<ProductionFeign> {@Overridepublic ProductionFeign create(Throwable cause) {log.error("服務異常。。。。。。。。。。。。。。。。。。。" + cause);return new ProductionFeign() {@Overridepublic String test1() {return "Fallback回滾";}};}
}
2.使用
@FeignClient(value = "cloud-production",fallbackFactory = ProductionFallbackFactory.class)
7.重試配置,服務端異常捕獲
@Slf4j
@Configuration
public class FeignConfiguration {/*** 自定義重試機制*/@Beanpublic Retryer feignRetryer() {//最大請求次數為5,初始間隔時間為100ms,下次間隔時間1.5倍遞增,重試間最大間隔時間為1s,return new Retryer.Default();}/*** 客戶端捕獲服務端異常*/@Beanpublic ErrorDecoder feignError() {return (key, response) -> {if (response.status() == 400) {log.error("請求xxx服務400參數錯誤,返回:{}", response.body());}if (response.status() == 409) {log.error("請求xxx服務409異常,返回:{}", response.body());}if (response.status() == 404) {log.error("請求xxx服務404異常,返回:{}", response.body());}// 其他異常交給Default去解碼處理// 這里使用單例即可,Default不用每次都去newreturn new ErrorDecoder.Default().decode(key, response);};}}
@FeignClient(value = "cloud-production",fallbackFactory = ProductionFallbackFactory.class,configuration = MyConfiguration.class)
8.連接池配置
<!--使用連接池--><dependency><groupId>io.github.openfeign</groupId><artifactId>feign-httpclient</artifactId></dependency>
feign:httpclient:# 支持httpClient的開關enabled: true#最大連接數max-connections: 200# 單個路徑的最大連接數max-connections-per-route: 50
2.Loadbalancer負載均衡測試
1.復制客戶端
2.修改端口啟動
3.測試
默認輪詢方式
調用
4.修改負載均衡算法
1.創建核心配置類
@Configuration
public class RestTemplateConfig {@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}@BeanReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,LoadBalancerClientFactory loadBalancerClientFactory) {// 獲取負載均衡器的名稱String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME);// 創建并返回一個隨機負載均衡器實例return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);}}
2.使用
@LoadBalancerClient(value = "cloud-production", configuration = RestTemplateConfig.class)
自帶三個算法,輪詢,隨機和nacos