上篇文章传送门:【springCloud搭建】三、集成springCloudGateway网关
ribbon+hystrix+feign所需的第三方包
<!--feign服务通讯组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!--ribbon负载均衡组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-ribbon</artifactId>
</dependency>
<!--hystrix熔断服务降级组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-netflix-hystrix</artifactId>
</dependency>
添加到gateway模块,service下的服务子模块的配置内
#Feign 配置
feign:
#开启feign熔断器功能
hystrix:
enabled: true
httpclient:
# 开启 Http Client
enabled: true
# 最大连接数,默认:200
max-connections: 200
# 最大路由,默认:50
max-connections-per-route: 50
# 连接超时,默认:2000/毫秒
connection-timeout: 2000
# 生存时间,默认:900L
time-to-live: 900
hystrix:
shareSecurityContext: true
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 5000
threadpool:
default:
coreSize: 100
#配置负载均衡
ribbon:
eager-load:
enabled: true
#指定服务饿加载
#clients:
# - service-one
# 请求处理的超时时间
ReadTimeout: 5000
# 请求连接的超时时间
ConnectTimeout: 2000
# 对当前实例的重试次数
maxAutoRetries: 1
# 切换实例的重试次数(根据自己单个服务实例数配置)
maxAutoRetriesNextServer: 3
# 对所有操作请求都进行重试
okToRetryOnAllOperations: true
# 对Http响应码进行重试
retryableStatusCodes: 500,404,502
feign
服务提供者service_one,服务消费者service_two
服务提供者service_one创建api接口类
package org.wcy.api;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.wcy.serviceOne.TestDTO;
/**
* <p>Title : TestApiController.java</p>
* <p>Description : 服务间调用的测试controller层</p>
* <p>DevelopTools : IntelliJ IDEA 2018.2.3 x64</p>
* <p>DevelopSystem : Windows 10</p>
* <p>Company : org.wcy</p>
* @author : WangChenYang
* @date : 2021/5/15 16:09
* @version : 0.0.1
*/
@RestController
@RequestMapping("test")
public class TestApiController {
/**
* 获取服务名字
* @author 王晨阳
* @date 2021/5/16-17:53
* @version 0.0.1
*/
@PostMapping("getName")
public String getServiceName() {
return "service_one";
}
}
在服务消费者service_two启动类上加上feign组件发现注解 ,org.wcy.api为service_one_api模块的外放接口包路径
@EnableFeignClients("org.wcy.api")
在service_one服务接口外放模块内创建刚刚写好的接口并加上@FeignClient注解表明他是一个feign服务接口
注意:feignClient的服务名无法识别_所以在yml文件内的服务名必须也是不带_的可以改成 -,否则启动就会报 Service id not legal hostname (xxx)
因为在配置内开启了feign的hystrix熔断功能所以必须要配置fallback类,否则服务调用时就会报 failed and no fallback available
package org.wcy.api;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.*;
import org.wcy.fallback.TestServiceFallback;
import org.wcy.serviceOne.TestDTO;
/**
* <p>Title : TestApi.java</p>
* <p>Description : TestApi接口服务类</p>
* <p>DevelopTools : IntelliJ IDEA 2018.2.3 x64</p>
* <p>DevelopSystem : Windows 10</p>
* <p>Company : org.wcy</p>
* @author : WangChenYang
* @date : 2021/5/16 18:06
* @version : 0.0.1
*/
/*name为服务名,path为controller上加的前置路径,fallback熔断回调类*/
@FeignClient(name = "service-one", path = "/test", fallback = TestServiceFallback.class)
public interface TestApi {
/**
* 获取服务名字
* @author 王晨阳
* @date 2021/5/16-17:53
* @version 0.0.1
*/
@RequestMapping(value = "getName", method = RequestMethod.POST)
String getServiceName();
}
package org.wcy.fallback;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import feign.hystrix.FallbackFactory;
import org.wcy.api.TestApi;
import org.wcy.serviceOne.TestDTO;
/**
* <p>Title : TestServiceFallback.java</p>
* <p>Description : TestApi熔断回调</p>
* <p>DevelopTools : IntelliJ IDEA 2018.2.3 x64</p>
* <p>DevelopSystem : Windows 10</p>
* <p>Company : org.wcy</p>
* @author : WangChenYang
* @date : 2021/5/16 19:43
* @version : 0.0.1
*/
@Component
public class TestServiceFallback implements TestApi {
private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceFallback.class);
public static final String ERR_MSG = "Test接口暂时不可用: ";
@Override
public String getServiceName() {
return TestServiceFallback.ERR_MSG;
}
}
引入service_one服务接口外放模块 service_one_api到服务消费者service_two的pom内
<?xml version="1.0" encoding="UTF-8"?>
<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.0</modelVersion>
<groupId>org.wcy</groupId>
<artifactId>service_two</artifactId>
<version>1.0.0</version>
<parent>
<groupId>org.wcy</groupId>
<artifactId>service</artifactId>
<version>1.0.0</version>
</parent>
<name>service_two</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<service_one.version>1.0.0</service_one.version>
</properties>
<dependencies>
<dependency>
<groupId>org.wcy</groupId>
<artifactId>service_one_api</artifactId>
<version>${service_one.version}</version>
</dependency>
</dependencies>
</project>
然后编写service_two外放给前端的接口,可以通过 @Autowired 注解直接注入其他服务的接口,像调用一个普通的service类那么简单
package org.wcy.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.wcy.api.TestApi;
/**
* <p>Title : TestController.java</p>
* <p>Description : 测试的controller层</p>
* <p>DevelopTools : IntelliJ IDEA 2018.2.3 x64</p>
* <p>DevelopSystem : Windows 10</p>
* <p>Company : org.wcy</p>
* @author : WangChenYang
* @date : 2021/5/15 16:08
* @version : 0.0.1
*/
@RestController
@RequestMapping("test")
public class TestController {
@Autowired
private TestApi testApi;
/**
* 获取服务一的名称
* @author 王晨阳
* @date 2021/5/16-18:26
* @version 0.0.1
*/
@GetMapping("getServiceOne")
public String getServiceOne() {
//调用服务一
return testApi.getServiceName();
}
}
接下来是启动service_one服务,service_two服务,gateway网关服务,nacos注册中心进行feign服务调用的测试!