一、导入SpringCloud与SpringBoot依赖包(必须版本对应,此处为2.2.x <-> Hoxton):
见此文章第一章:JavaEE:SpringCloud-使用Eureka发布微服务_a526001650a的专栏-CSDN博客
二、给被调用Module中配置微服务名称,在被调用Module工程/application.yml文件中:
spring:
application:
name: mall-usercenter #配置被调用微服务的名称
三、使用Feign调用微服务(在调用者Module中配置):
1.导入Feign依赖包、Eureka的Client端依赖包、Web功能依赖包:
<dependencies>
<!-- 导入Feign依赖包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 导入Eureka的Client端依赖包 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- 导入Web功能依赖包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2.导入Eureka Server配置的地址,否则无法发现服务:
spring:
application:
name: mall-feign #配置当前微服务名称
server: #配置当前微服务端口号
port: 10002
eureka: #导入Eureka Server配置的地址,否则无法发现服务
client:
service-url:
defaultZone: http://127.0.0.1:10000/eureka/
feign: #feign超时配置优先级高于Ribbon超时配置
client:
config:
default:
connectTimeout: 1000 #连接超时时间,此处为1000毫秒
readTimeout: 3000 #业务处理超时时间,此处为3000毫秒
#微服务名称: #此处改成具体服务名,配置某个微服务的超时时间,优先级高过default配置
#connectTimeout: 1000 #连接超时时间,此处为1000毫秒
#readTimeout: 3000 #业务处理超时时间,此处为3000毫秒
compression: #其他配置
request:
enabled: true #打开请求数据压缩
mime-types: text/html,application/xml,application/json #需要压缩的数据类型
min-request-size: 1024 #设置触发数据压缩的最小容量
response:
enabled: true #打开响应数据压缩
3.在Application启动类上添加Feign注解:
@SpringBootApplication //标识为启动类
@EnableDiscoveryClient //发现微服务
@EnableFeignClients //用Feign方式调用
public class FeignApplication {
public static void main(String[] args) {
SpringApplication.run(FeignApplication.class);//加载启动类
}
}
4.添加Feign调用接口(调用配置了EurekaClient端的微服务Module):
@FeignClient("mall-usercenter") //配置被调用的微服务名称(不能有下划线)
public interface UserCenterClient {
//请求路径为:http://127.0.0.1:10001/getUserDetail/xxx ,userNo是参数值
@RequestMapping(value = "getUserDetail/{userNo}", method = RequestMethod.GET)
String getUserDetail(@PathVariable("userNo") String userNo); // @PathVariable用于将{userNo}的值取出,赋值给userNo
}
5.测试调用,创建请求处理类:
@Controller
public class UserAPIController {
@Autowired
private UserCenterClient uerCenterClient;
//请求路径:http://127.0.0.1:10002/getUserDetailAPI/1001,userNo是参数值
@RequestMapping(value = "getUserDetailAPI/{userNo}", method = RequestMethod.GET)
@ResponseBody // @ResponseBody将返回对象转换为json字符串
public String getUserDetailAPI(@PathVariable("userNo") String userNo) {// @PathVariable用于将{userNo}的值取出,赋值给userNo
String json = uerCenterClient.getUserDetail(userNo);
System.out.println("从用户中心微服务获取的值, json: " + json);
return json;
}
}
四、在Feign中配置Hystrix:
开启feign下的Hystrix功能,在调用者Module工程/application.yml文件中:
feign:
hystrix: #开启feign下的Hystrix功能
enabled: true
1.方式1:
(1)新增Feign接口的实现类,实现降级方法:
@Component//Hystrix降级实现类
public class UserCenterClientImpl implements UserCenterClient {
@Override
public String commonFallback(String userNo) {//Hystrix降级方法
return "触发Hystrix降级方法";
}
}
(2)在Feign接口中配置fallback为上面实现类:
@FeignClient(value = "mall-usercenter", fallback = UserCenterClientImpl.class) //fallback配置实现类
public interface UserCenterClient {
//...
}
2.方式2:
(1)新增FallbackFactory实现类:
@Component
public class MyFallbackFactory implements FallbackFactory<UserCenterClient> {//配置在@FeignClient(fallbackFactory = MyFallbackFactory.class)中
@Override
public UserCenterClient create(Throwable throwable) {
return new UserCenterClient() {//实现接口
//...降级方法实现
};
}
}
(2)在Feign接口中配置fallbackFactory属性为以上FallbackFactory实现类:
@FeignClient(value = "mall-usercenter", fallbackFactory = MyFallbackFactory.class) //fallbackFactory配实现类(MyFallbackFactory实现接口的降级方法)
public interface UserCenterClient {
//...
}