1. 程式人生 > >SpringCloud微服務 之Feign(三-Customize)

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