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依存: ブートクラス追加サポートfeignのコメント@EnbaleFeign Cliennts; は、呼び出しインターフェースを追加し、注釈@Feign Clientで修飾し、valueの値で呼び出しのサービス名を指定する. は、前のステップでインターフェースを呼び出し、コールサービス方法を追加し、注釈@Request Mappingで修飾し、サービスパスを注釈内で指定する.サービス方法のパラメータは@Request Paramで修飾します. は、実際には、直接にインターフェースメソッドを呼び出すことができます. ここでは基本的なフィignの使用手順を完了しました.
2.2溶断ステップの追加
溶断とは、サービスが利用できない場合に提供されるサービスポリシーであり、2.1の全てのステップを完了した後、溶断を開くには以下の手順が必要である. appration.yamlにオンオフ設定を追加します. ヒューズサービスを追加し、すなわち実装クラスを追加し、呼び出しインターフェースを実現する. インターフェース注釈@Feign Clientのプロパティfallback指定溶断サービスクラスの例を呼び出します. 三、例
ここは登録センターのspring_を使います.cloud_レジスターセンター、サービススプリングcloud_プロバイダー、クライアントのspring_cloud_clientfeignを例に挙げます.
3.1登録センター
登録センターはspring_です.cloud_レジスターセンター・プロジェクト
3.1.1 maven依存
サービスはスプリングですcloud_プロバイダープロジェクト
3.2.1 maven依存
エンティティbeanクラスを定義するStu.java
3.3.1 maven依存は、エンティティクラスを定義する: スタートクラスを定義する: 呼び出しインターフェースを定義する: ヒューズサービスの実現クラスを定義する: 定義controller:
登録センターspring_を順次起動します.cloud_レジスターセンター、サービススプリングcloud_provider(複数のインスタンスを起動し、ポートが異なり、サービス名が同じ)、クライアントspring_cloud_clientfeign
一般テスト:
記事の目次
FeignはNetflixが開発した声明式であり、テンプレート化したhttpクライアントであり、httpへの呼び出しを簡略化している.同時にFeignは負荷均衡戦略と溶断戦略を持っています.ここではその使用を紹介します.
二、ステップ
2.1 Feign使用手順
Feignを開くステップは以下の通りです.
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>
2.2溶断ステップの追加
溶断とは、サービスが利用できない場合に提供されるサービスポリシーであり、2.1の全てのステップを完了した後、溶断を開くには以下の手順が必要である.
feign:
hystrix:
enabled: true #feign
ここは登録センターの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.javapackage 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);
}
}
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
}