SpringCloud微服務 之Feign(三-Customize)
前言
上一小節我們學習了在SpringCloud微服務架構下使用自定義的FeignClient來完成各個模組間的通訊。本小節來學習一下如何使用SpringCloud微服務架構下使用自定義的FeignClient來完成微服務模組之外的通訊。
本小節案例基於 SpringCloud微服務 之Feign(二-Customize)
場景說明:在SpringCloud微服務架構下使用自定義的FeignClient來完成微服務模組之外的通訊,以訪問Eureka登錄檔中的節點資訊為例,同時實現使用自定義的FeignClient來完成微服務模組之外通訊的authentication。
案例
-
Eureka Server端編寫:
-
專案結構
-
CoreCode
@SpringBootApplication @EnableEurekaServer public class MicroserviceDealEurekaAuthenticationApplication { public static void main(String[] args) { SpringApplication.run(MicroserviceDealEurekaAuthenticationApplication.class, args); } }
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter { /** * 高版本的丟棄了 * * security: basic: enabled: true * * 配置,應該使用以下方式開啟 * * @param http * @throws Exception */ @Override protected void configure(HttpSecurity http) throws Exception { // Configure HttpSecurity as needed (e.g. enable http basic). http.sessionManagement().sessionCreationPolicy( SessionCreationPolicy.NEVER); http.csrf().disable(); // 注意:為了可以使用 http://${user}:${password}@${host}:${port}/eureka/ // 這種方式登入,所以必須是httpBasic, // 如果是form方式,不能使用url格式登入 http.authorizeRequests().anyRequest().authenticated().and().httpBasic(); } }
spring: security: basic: enabled: true # 開啟基於HTTP basic的認證 user: name: Dustyone # 配置登入的賬號是Dustyone password: bai5331359 # 配置登入的密碼是bai5331359 server: port: 8080 # 指定該Eureka例項的埠 eureka: server: enableSelfPreservation: true client: registerWithEureka: false #Server端不做自我註冊 fetchRegistry: false serviceUrl: #defaultZone: http://localhost:8080/eureka/ defaultZone: http://Dustyone:[email protected]:8080/eureka/ healthcheck: enabled: true #開啟健康檢查
-
-
Eureka Client端服務提供方編寫。
-
專案結構
-
CordeCode
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients //開啟FeignClient註解 public class MicroserviceDealBrokerFeignCustomizedExternalApplication { public static void main(String[] args) { SpringApplication.run(MicroserviceDealBrokerFeignCustomizedExternalApplication.class, args); } }
@Configuration public class FeignConfiguration { /** * Feign預設使用的是SpringMVC的contract並支援所有SpringMVC contract支援的註解 * Feign預設使用的是Feign自己封裝的feignContract(MVCcontract)若是用Feign的Contract則自定義的Feign interface中需要使用Feign自己的mvc contract * @return */ @Bean public Contract feignContract() { return new feign.Contract.Default(); } /** * 將RequestInterceptor新增到RequestInterceptor的集合中 * @return */ @Bean public BasicAuthRequestInterceptor basicAuthRequestInterceptor() { return new BasicAuthRequestInterceptor("Dustyone", "bai5331359"); } }
/** * 使用FeignClient訪問外部連線是需要在@FeignClient總新增url節點,若訪問的外部連結需要做身份認證則需要Feign先實現BasicAuthRequestInterceptor * @author Dustyoned * */ @FeignClient(name="Deom",url="http://localhost:8080",configuration=FeignConfiguration.class) public interface ExternalFeignClientInterface { @RequestLine("GET /eureka/apps/{serviceName}") public String findServiceInfoFromEurekaByServiceName(@Param(value="serviceName") String serviceName); }
@RestController public class BrokerController { @Autowired private ExternalFeignClientInterface externalFeignClientInterface; @GetMapping("/findServicenInfo/{serviceName}") public String findServiceInfoByServiceName(@PathVariable("serviceName") String serviceName){ return this.externalFeignClientInterface.findServiceInfoFromEurekaByServiceName(serviceName); } }
server: port: 8082 spring: application: name: microservice-deal-broker-cloud-feign-cusomized-external eureka: client: serviceUrl: #defaultZone: http://localhost:8080/eureka/ defaultZone: http://Dustyone:[email protected]:8080/eureka/ instance: prefer-ip-address: true #使用Feign時必須新增以下兩項配置 ribbon: eureka: enabled: true #設定feign的hystrix響應超時時間(必須) hystrix: command: default: execution: isolation: thread: timeoutInMilliseconds: 5000 feign: httpclient: enabled:true
-
訪問:http://localhost:8082/findServicenInfo/microservice-deal-broker-cloud-feign-cusomized-external
小結
-
Eureka 使用 spring-boot-starter-security 來對前來註冊的服務節點做身份校驗,需要引入spring-boot-starter-security依賴,並且在較高的SpringCloud和SpringBoot版本中需要對Eureka Server端做額外的宣告:即對前來註冊的服務節點做基於httpBasic的校驗而不是以form表單的方式來實現的。參考WebSecurityConfig.java。
-
在SpringCloud微服務架構下使用自定義的FeignClient來完成微服務模組之外的通訊需要的Feign的Client端做一些特殊宣告即在@FeignClient註解的節點上做url的宣告,若存在URL的宣告FeignClient將優先定URL提供的通訊連線而此時@FeignClient的name或者value節點的宣告權重讓位給url。
-
若Eureka使用 spring-boot-starter-security 來對前來註冊的服務節點做身份校驗,前來註冊的服務節點需要提供principals and credentials即認證要求的使用者名稱和密碼。
-
本小節案例用到了:microservice-deal-eureka-authentication、microservice-deal-broker-cloud-feign-cusomized-external