spring cloudで宣言式RESTがFeignを呼び出します.

75776 ワード

spring cloudで宣言式RESTがFeignを呼び出します.
記事の目次
  • spring cloudで宣言式RESTがFeign
  • を呼び出す.
  • 一、プロフィール
  • 、ステップ
  • .Feign使用ステップ
  • .溶断ステップ
  • を追加する.
  • 、例
  • 3.1登録センター
  • 3.1.1 maven依存
  • 3.1.2 appication.yaml構成
  • 3.1.3スタートクラス
  • 3.2サービス
  • 3.2.1 maven依存
  • 3.2.2 appication.yaml構成
  • 3.2.3サービス関連クラス
  • 3.3クライアント
  • 3.3.1 maven依存
  • 3.3.2 appication.yaml構成
  • 3.3関連クラス
  • を呼び出します.
  • .4.4試験
  • 一、概要
    FeignはNetflixが開発した声明式であり、テンプレート化したhttpクライアントであり、httpへの呼び出しを簡略化している.同時にFeignは負荷均衡戦略と溶断戦略を持っています.ここではその使用を紹介します.
    二、ステップ
    2.1 Feign使用手順
    Feignを開くステップは以下の通りです.
  • 追加コアmaven依存:
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-openfeignartifactId>
    dependency>
    
  • ブートクラス追加サポートfeignのコメント@EnbaleFeign Cliennts;
  • は、呼び出しインターフェースを追加し、注釈@Feign Clientで修飾し、valueの値で呼び出しのサービス名を指定する.
  • は、前のステップでインターフェースを呼び出し、コールサービス方法を追加し、注釈@Request Mappingで修飾し、サービスパスを注釈内で指定する.サービス方法のパラメータは@Request Paramで修飾します.
  • は、実際には、直接にインターフェースメソッドを呼び出すことができます.
  • ここでは基本的なフィignの使用手順を完了しました.
    2.2溶断ステップの追加
    溶断とは、サービスが利用できない場合に提供されるサービスポリシーであり、2.1の全てのステップを完了した後、溶断を開くには以下の手順が必要である.
  • appration.yamlにオンオフ設定を追加します.
    feign:
      hystrix:
        enabled: true #feign        
    
  • ヒューズサービスを追加し、すなわち実装クラスを追加し、呼び出しインターフェースを実現する.
  • インターフェース注釈@Feign Clientのプロパティfallback指定溶断サービスクラスの例を呼び出します.
  • 三、例
    ここは登録センターのspring_を使います.cloud_レジスターセンター、サービススプリングcloud_プロバイダー、クライアントのspring_cloud_clientfeignを例に挙げます.
    3.1登録センター
    登録センターはspring_です.cloud_レジスターセンター・プロジェクト
    3.1.1 maven依存
    
    <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>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.3.2.RELEASEversion>
            <relativePath/> 
        parent>
        <groupId>com.dragon.studygroupId>
        <artifactId>spring_cloud_register_centerartifactId>
        <version>0.0.1-SNAPSHOTversion>
        <name>spring_cloud_register_centername>
        <description>Demo project for Spring Bootdescription>
    
        <properties>
            <java.version>1.8java.version>
            <spring-cloud.version>Hoxton.SR6spring-cloud.version>
        properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
        dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloudgroupId>
                    <artifactId>spring-cloud-dependenciesartifactId>
                    <version>${spring-cloud.version}version>
                    <type>pomtype>
                    <scope>importscope>
                dependency>
            dependencies>
        dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                plugin>
            plugins>
        build>
    project>
    
    3.1.2 appication.yaml配置
    server:
      port: 8010
    spring:
      application:
        name: spring-cloud-register-center
    eureka:
      client:
        serviceUrl:
          defaultZone: http://localhost:${server.port}/eureka/
        fetchRegistry: false #        ,           ,     
        registerWithEureka: false #      ,          ,      
    
    3.1.3始動類
    package com.dragon.study.spring_cloud_register_center;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
    @SpringBootApplication
    @EnableEurekaServer
    public class SpringCloudRegisterCenterApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudRegisterCenterApplication.class, args);
        }
    }
    
    3.2サービス
    サービスはスプリングですcloud_プロバイダープロジェクト
    3.2.1 maven依存
    
    <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>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.3.2.RELEASEversion>
            <relativePath/> 
        parent>
        <groupId>com.dragon.studygroupId>
        <artifactId>spring_cloud_providerartifactId>
        <version>0.0.1-SNAPSHOTversion>
        <name>spring_cloud_providername>
        <description>Demo project for Spring Bootdescription>
    
        <properties>
            <java.version>1.8java.version>
            <spring-cloud.version>Hoxton.SR6spring-cloud.version>
        properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <version>1.18.6version>
                <scope>compilescope>
            dependency>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
            dependency>
        dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloudgroupId>
                    <artifactId>spring-cloud-dependenciesartifactId>
                    <version>${spring-cloud.version}version>
                    <type>pomtype>
                    <scope>importscope>
                dependency>
            dependencies>
        dependencyManagement>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                plugin>
            plugins>
        build>
    project>
    
    3.2.2 appication.yaml設定
    server:
      port: 8011
    spring:
      application:
        name: spring-cloud-provider
    eureka:
      instance:
        prefer-ip-address: true #true    ip  ,  false,       hostname  
      client:
        service-url:
          default-zone: http://localhost:8010/eureka/
    management:
      endpoints:
        web:
          exposure:
            include: "*"
    
    3.2.3サービス関連類
    エンティティbeanクラスを定義するStu.java
    package com.dragon.study.spring_cloud_provider.bean;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class Stu {
        private String stuId;
        private  Integer age;
    }
    
    定義サービスcontroller類StuController.java
    package com.dragon.study.spring_cloud_provider.controller;
    import com.dragon.study.spring_cloud_provider.bean.Stu;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    @RestController
    @RequestMapping("stu")
    public class StuController {
        @RequestMapping("getStu")
        private Object getStu(Stu stu) {
            System.out.println(stu);
            return stu;
        }
    }
    
    スタートクラスSprigCloudProvider Apple.javaを定義します.
    package com.dragon.study.spring_cloud_provider;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    @SpringBootApplication
    @EnableDiscoveryClient
    public class SpringCloudProviderApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudProviderApplication.class, args);
        }
    }
    
    3.3クライアント
    3.3.1 maven依存
    
    <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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0modelVersion>
        <parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.3.2.RELEASEversion>
            <relativePath/> 
        parent>
        <groupId>com.dragon.studygroupId>
        <artifactId>spring_cloud_client_feignartifactId>
        <version>0.0.1-SNAPSHOTversion>
        <name>spring_cloud_client_feignname>
        <description>Demo project for Spring Bootdescription>
    
        <properties>
            <java.version>1.8java.version>
            <spring-cloud.version>Hoxton.SR6spring-cloud.version>
        properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-starter-openfeignartifactId>
            dependency>
    
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <optional>trueoptional>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
        dependencies>
    
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloudgroupId>
                    <artifactId>spring-cloud-dependenciesartifactId>
                    <version>${spring-cloud.version}version>
                    <type>pomtype>
                    <scope>importscope>
                dependency>
            dependencies>
        dependencyManagement>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.bootgroupId>
                    <artifactId>spring-boot-maven-pluginartifactId>
                plugin>
            plugins>
        build>
    project>
    
    3.3.2 appication.yaml設定
    server:
      port: 8052
    spring:
      application:
        name: spring-cloud-feign-client
    eureka:
      instance:
        preferIpAddress: true #true    ip  ,  false,       hostname  
      client:
        serviceUrl:
          defaultZone: http://localhost:8010/eureka/
    feign:
      hystrix:
        enabled: true #feign        
    
    3.3.3関連クラスの呼び出し
  • は、エンティティクラスを定義する:
  • package com.dragon.study.spring_cloud_feign_client.bean;
    import lombok.AllArgsConstructor;
    import lombok.Data;
    import lombok.NoArgsConstructor;
    @Data
    @NoArgsConstructor
    @AllArgsConstructor
    public class Stu {
        private String stuId;
        private  Integer age;
    }
    
  • スタートクラスを定義する:
  • package com.dragon.study.spring_cloud_feign_client;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
    import org.springframework.cloud.openfeign.EnableFeignClients;
    @SpringBootApplication
    @EnableEurekaClient
    @EnableFeignClients
    public class SpringCloudFeignClientApplication {
        public static void main(String[] args) {
            SpringApplication.run(SpringCloudFeignClientApplication.class, args);
        }
    }
    
  • 呼び出しインターフェースを定義する:
  • package com.dragon.study.spring_cloud_feign_client.service;
    import com.dragon.study.spring_cloud_feign_client.bean.Stu;
    import org.springframework.cloud.openfeign.FeignClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    @FeignClient(value = "spring-cloud-provider", fallback = StuServiceHystrix.class)
    public interface StuServiceFeign {
        @RequestMapping("/stu/getStu")
        Stu getStu(@RequestParam String stuId, @RequestParam Integer age);
    }
    
  • ヒューズサービスの実現クラスを定義する:
  • package com.dragon.study.spring_cloud_feign_client.service;
    import com.dragon.study.spring_cloud_feign_client.bean.Stu;
    import org.springframework.stereotype.Service;
    @Service
    public class StuServiceHystrix implements StuServiceFeign {
        //             
        @Override
        public Stu getStu(String stuId, Integer age) {
            return new Stu("000",18);
        }
    }
    
  • 定義controller:
  • package com.dragon.study.spring_cloud_feign_client.controller;
    import com.dragon.study.spring_cloud_feign_client.bean.Stu;
    import com.dragon.study.spring_cloud_feign_client.service.StuServiceFeign;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RestController;
    import javax.annotation.Resource;
    @RestController
    @RequestMapping("stu")
    public class StuController {
        @Resource
        private StuServiceFeign stuServiceFeign;
        @RequestMapping("getStu")
        public Object getStu(Stu stu) {
            return stuServiceFeign.getStu(stu.getStuId(), stu.getAge());
        }
    }
    
    4.4テスト
    登録センターspring_を順次起動します.cloud_レジスターセンター、サービススプリングcloud_provider(複数のインスタンスを起動し、ポートが異なり、サービス名が同じ)、クライアントspring_cloud_clientfeign
    一般テスト:
    #          ,       ,            
    GET http://localhost:8052/stu/getStu?stuId=001&age=17
    Accept: application/json
    
    上記正常出力は以下の通りです.
    {
      "stuId": "001",
      "age": 17
    }
    
    溶断テスト、全てのサービスを停止し、再度調整し、出力は:
    {
      "stuId": "000",
      "age": 18
    }