sringcloud2.0ラーニング-10-宣言サービスコールSpringCloud Feign

53130 ワード

宣言サービスコールSpringCloud Feign
Springcloudには、RestTemplateを介して次のように呼び出される2つのインタフェース呼び出し方式があります.
restTemplate.getForObject("http://app-member/getmember", String.class);

個人的には、この方法はインタフェースの呼び出しをビジネスコードと混ぜ合わせ、あまり友好的ではなく、基本的に使わないことを理解しています.もう1つはFeignクライアント呼び出しであり,Feginはインタフェース注釈方式で実現され,読みやすさが強い.
1.Feignの概要
Feignクライアントは、Web宣言httpリモートコールツールであり、インタフェースと注釈方式で呼び出されます.
2.Feignの使用
親プロジェクトを作成し、3つのModule:Eureka Server、memberService、orderServiceを作成し、eureka自己保護をオフにします.
2.1親工事構築
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0modelVersion>
  <groupId>com.lchtestgroupId>
  <artifactId>springcloud2.0-eureka-selfprotectartifactId>
  <version>0.0.1-SNAPSHOTversion>
  <packaging>pompackaging>
  
   <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.0.3.RELEASEversion>
    parent>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>Finchley.RELEASEversion>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>
    <modules>
    	<module>eureka-servermodule>
    	<module>springcloud2.0-eureka-selfprotect-eurekaservermodule>
    	<module>springcloud2.0-eureka-selfprotect-ordermodule>
    	<module>springcloud2.0-eureka-selfprotect-membermodule>
    modules>
project>

2.2 EurekaServerモジュール構築
  • pom導入spring-cloud-starter-netflix-eureka-server依存:
  • <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0modelVersion>
      <parent>
        <groupId>com.lchtestgroupId>
        <artifactId>springcloud2.0-eureka-selfprotectartifactId>
        <version>0.0.1-SNAPSHOTversion>
      parent>
      <artifactId>springcloud2.0-eureka-selfprotect-eurekaserverartifactId>
      <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
            dependency>
        dependencies>
      
    project>
    
  • yaml構成、Eureka自己保護
  • を閉じる
    server:
      port: 8100
    
    eureka:
      instance:
      #    ip  
        hostname: 127.0.0.1
      client:
        service-url:
          defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
        #             
        register-with-eureka: false
        fetch-registry: false
      server:
        #         ,            
        enable-self-preservation: false
        #          
        eviction-interval-timer-in-ms: 2000
    
  • 起動クラス@EnableEureakServerオープン登録センター
  • package com.lchtest.springcloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    
    @SpringBootApplication
    //@EnableEureakServer        
    @EnableEurekaServer
    public class AppEurekaServer {
    	public static void main(String[] args) {
    		SpringApplication.run(AppEurekaServer.class, args);
    	}
    }
    

    2.3メンバーサービス構築
  • pom spring-cloud-starter-netflix-eureka-client依存およびspringboot-webコンポーネント
  • を導入
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0modelVersion>
      <parent>
        <groupId>com.lchtestgroupId>
        <artifactId>springcloud2.0-eureka-selfprotectartifactId>
        <version>0.0.1-SNAPSHOTversion>
      parent>
      <artifactId>springcloud2.0-eureka-selfprotect-memberartifactId>
      
       <dependencies>
              
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
             dependency>
             
            <dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-webartifactId>
    		dependency>
        dependencies>
    project>
    
  • yamlは登録センタアドレスを構成し、クライアント心拍検出時間
  • を設定する.
    #          
    server:
      port: 8070
    #     --            
    spring:
      application:
        name: app-member
    eureka:
      client:
        service-url:
          #        eureka    
          defaultZone: http://localhost:8100/eureka/
        #           ,   true
        register-with-eureka: true
        #       
        fetch-registry: true
      # eureka    eureka            ,         ,           
      instance:
        # eureka                ,    
        lease-renewal-interval-in-seconds: 1
        # eureka                       ,    ,        
        lease-expiration-duration-in-seconds: 2     
    
  • 起動クラス:@EnableEurekaClient注記を使用してメンバーサービスを登録センター
  • に登録
    package com.lchtest.springcloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    
    @SpringBootApplication
    @EnableEurekaClient
    public class AppMember {
    
    	public static void main(String[] args) {
    		SpringApplication.run(AppMember.class, args);
    	}
    }
    
  • MemberController
  • package com.lchtest.springcloud.controller;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class MemberController {
    	
    	@Value("${server.port}")
    	private String port;
    	
    	@RequestMapping("/member/getmember")
    	public String getMemberByFeign() {
    		return "member service port=" + port;
    	}
    }
    

    2.4 OrderService構築
  • pom依存統合Feignクライアントspring-cloud-starter-openfeignおよびspringboot-webコンポーネント
  • <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
      <modelVersion>4.0.0modelVersion>
      <parent>
        <groupId>com.lchtestgroupId>
        <artifactId>springcloud2.0-eureka-selfprotectartifactId>
        <version>0.0.1-SNAPSHOTversion>
      parent>
      <artifactId>springcloud2.0-eureka-selfprotect-orderartifactId>
      
       <dependencies>
                   
              
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
             dependency>
             
            <dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starter-webartifactId>
    		dependency>
    		
    		 
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-openfeignartifactId>
            dependency>
        dependencies>
    project>
    
  • プロファイル
  • #          
    server:
      port: 8001
    #     --            
    spring:
      application:
        name: app-order
    eureka:
      client:
        service-url:
          #        eureka    
          defaultZone: http://localhost:8100/eureka/
        #           ,   true
        register-with-eureka: true
        #       
        fetch-registry: true
      # eureka    eureka            ,         ,           
      instance:
        # eureka                ,    
        lease-renewal-interval-in-seconds: 1
        # eureka                       ,    ,        
        lease-expiration-duration-in-seconds: 2
    
  • Feignクライアントインタフェース定義
  • package com.lchtest.springcloud.feignclient;
    
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    
    /**
     *    Feign       
     * @author pc
     */
    @FeignClient(value = "app-member")
    public interface MemberFeign {
    
    	@RequestMapping("/member/getmember")
    	public String getmember();
    }
    

    @FeignClient(value="app-member"),@FeignClientはFeignクライアントを表し,valueの値はクライアントが呼び出すサービスが登録センターにある名前@RequestMapping("/member/getmember")はrpc方式で呼び出すリモートインタフェース/member/getmemberであり,サービスプロバイダが外部に露出したインタフェースFeignClient注釈は本質的には注釈を取得した値を反射して取得し、呼び出すサービスの名前を取得し、登録センターに行ってサービスに対応するアドレス情報を取得し、@RequestMapping注釈の値に基づいてインタフェース呼び出しアドレスを組み立て、最後にHttpClient方式で呼び出すべきであると推測する
  • Controller Controller Controller Controller Controller Controller Controller Controller Controller Controller Controller Controller Controller Controller Controller Controller Controller Controller Controller Controller Controller
    package com.lchtest.springcloud.controller;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    import com.lchtest.springcloud.feignclient.MemberFeign;
    
    @RestController
    @RequestMapping("/orderfeign")
    public class FeignClientTestController {
    	@Autowired
    	private MemberFeign memberFeign;
    	
    	/**
    	 *   feign     member  :http://localhost:8001/orderfeign/getmemberByFeign  
    	 * @return
    	 */
    	@RequestMapping("/getmemberByFeign")
    	public String getmember() {
    		return "  Feign     member  ,   :" + memberFeign.getmember();
    	}
    }
    
  • メイン起動クラス@EnableFeignClients注記を追加してfeignクライアント
  • を有効にする必要があります.
    package com.lchtest.springcloud;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    
    @SpringBootApplication
    @EnableEurekaClient
    @EnableFeignClients //   feign   
    public class AppOrder {
    
    	public static void main(String[] args) {
    		SpringApplication.run(AppOrder.class, args);
    	}
    }
    

    Feignクライアント使用手順まとめ
  • Feignクライアントを使用するプロジェクト統合Feignクライアント
  •  <dependency>
           <groupId>org.springframework.cloudgroupId>
           <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
  • Feignクライアントインタフェース定義インタフェースクラス名に注記@FeignClient(value="app-member")を付けてFeignクライアントを宣言し、呼び出すマイクロサービスが登録センターに登録されている名前を指定し、@RequestMapping呼び出すインタフェースメソッドを指定します:
  • @FeignClient(value = "app-member")
    public interface MemberFeign {
    	@RequestMapping("/member/getmember")
    	public String getmember();
    }
    
  • Feignクライアントの場所を使用してFeignクライアントインタフェースを注入し、
  • を呼び出す.
    //   
    @Autowired
    private MemberFeign memberFeign;
    //     
    memberFeign.getmember();
    
  • 起動クラスに@EnableFeignClients注記を追加Feignクライアント
  • を有効にする
    現在のFeignクライアント呼び出しの欠点sringcloud2.0学习-10- 声明式服务调用SpringCloud Feign_第1张图片
    orderサービスがFeignクライアントを介してmemberサービスの/member/getmemberインタフェースを呼び出すには、orderサービスで同じFeignクライアントインタフェースを定義する必要があり、多くのインタフェースがあれば、このような重複コードが多くなるため、このようなプロジェクトの構成は合理的ではないことがわかります.
    ダウンロードコードをクリックしてspringcloud 2を参照してください.0-eureka-selfprotectエンジニアリング