Spring Cloud-hystrix Feign(九)
前面使用ribbon拦截RestTemplate 实现服务的负载均衡 使用Hystrix进行熔断降级请求缓存 用原生的方式 将会有大量的模板代码,feigin就是rabbon和Histrix的整合 同
使用feign只需要通过接口对服务方的绑定 实现多处调用
使用例子
1.引入Pom依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--开启端点 用于dashboard监控-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2.定义一个接口描述服务信息
@FeignClient("PROVIDER")
@RequestMapping("/user")
public interface UserService {
@RequestMapping(value = "/findById",method = RequestMethod.GET)
public User findById(@RequestParam("id") Integer id);
@RequestMapping(value = "/findAll",method = RequestMethod.GET)
public List<User> findAll();
@RequestMapping(value = "/deleteById",method = RequestMethod.GET)
public Boolean deleteById(@RequestParam("id")Integer id);
@RequestMapping(value = "/update",method = RequestMethod.POST)
public Boolean update(@RequestBody User user);
}
@FeignClient 是用于服务发现 发现指定服务
@RequestMapping 为请求指定服务 指定方式
@RequestBody 表示参数是封装在报文体出传输 服务端 接收也需要打RequestBody
3.入口类开启Fegin以及服务发现
@SpringBootApplication
@EnableFeignClients //开启feigin
@EnableDiscoveryClient //开启服务发现
public class SpringCloudFeignConsumerApplication { public static void main(String[] args) {
SpringApplication.run(SpringCloudFeignConsumerApplication.class, args);
} }
4.通过注入实现调用
@RestController
public class UserContorller {
@Autowired
UserService userService;
@RequestMapping("/findById")
@ResponseBody
public User findById(Integer id) {
return userService.findById(id);
} @RequestMapping("/findAll")
@ResponseBody
public List<User> findAll() {
return userService.findAll();
} @RequestMapping("/deleteById")
@ResponseBody
public Boolean deleteById(Integer id) {
return userService.deleteById(1);
} @RequestMapping("/update")
@ResponseBody
public Boolean update() {
User user=new User();
user.setId(1);
user.setName("测试修改");
User filterUser = userService.findById(user.getId());
filterUser.setName(user.getName());
userService.update(filterUser);
return true;
}
}
继承特性
将接口定义在服务端 服务消费者通过继承方式实现服务订阅。避免 每个服务消费者 都要重复定义接口描述
1.新增一个API项目并被服务端和客户端依赖 同时依赖web 因为需要使用springMVC注解对接口描述

3.pom依赖
<!--定义接口约束 需要用到springMVC的注解-->
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
</dependencies>
<!--用普通jar打包的方式-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
jar包打包方式 都改为传统的打包方式 否则 其他依赖会报错 找不到 符号 因为存在2个入口类
3.api项目添加一个接口描述
@RequestMapping("/user")
public interface UserService {
@RequestMapping(value = "/findById",method = RequestMethod.GET)
public User findById(@RequestParam("id") Integer id);
@RequestMapping(value = "/findAll",method = RequestMethod.GET)
public List<User> findAll();
@RequestMapping(value = "/deleteById",method = RequestMethod.GET)
public Boolean deleteById(@RequestParam("id")Integer id);
@RequestMapping(value = "/update",method = RequestMethod.POST)
public Boolean update(@RequestBody User user);
}
4.更改provider
@Controller
@RequestMapping("/user")
public class UserContorller implements UserService {
List<User> users; public UserContorller() {
users = new ArrayList<>();
users.add(new User(1, "小明", 1));
users.add(new User(2, "小香", 0));
users.add(new User(3, "小方", 0));
users.add(new User(4, "小张", 0));
users.add(new User(6, "小李", 0)); } @RequestMapping("/findById")
@ResponseBody
public User findById(Integer id) {
return users.stream().filter(c -> c.getId().intValue() == id.intValue()).findAny().get();
} @RequestMapping("/findAll")
@ResponseBody
public List<User> findAll() {
return users;
} @RequestMapping("/deleteById")
@ResponseBody
public Boolean deleteById(Integer id) {
return users.removeIf(c -> c.getId().intValue() == id.intValue());
} @RequestMapping("/update")
@ResponseBody
public Boolean update(@RequestBody User user) {
User filterUser = findById(user.getId());
filterUser.setName(user.getName());
return true;
}
}
5.更改consumer Service继承api的Service
@FeignClient("PROVIDER")
public interface UserService extends com.liqiang.api.UserService {
}
6.consumer调用注入Service
@RestController
public class UserContorller {
@Autowired
UserService userService;
@RequestMapping("/findById")
@ResponseBody
public User findById(Integer id) {
return userService.findById(id);
} @RequestMapping("/findAll")
@ResponseBody
public List<User> findAll() {
return userService.findAll();
} @RequestMapping("/deleteById")
@ResponseBody
public Boolean deleteById(Integer id) {
return userService.deleteById(1);
} @RequestMapping("/update")
@ResponseBody
public Boolean update() {
User user=new User();
user.setId(1);
user.setName("测试修改");
User filterUser = userService.findById(user.getId());
filterUser.setName(user.getName());
userService.update(filterUser);
return true;
}
}
继承的缺点 接口修改 会导致调用端的构建失败 不同通过版本控制可以避免
Ribbon配置
全局配置
通过ribbon.<属性>=..
ribbon:
ConnectTimeout: 500
ReadTimeout=5000
指定服务配置及重试
<服务名>.ribbon.<属性>=... 服务名为@FeginClient配置
#对指定服务设置rabbion全局参数 Fegin接口@FeignClient("PROVIDER")
PROVIDER:
ribbon:
#配置首台服务器重试1次
MaxAutoRetries: 1
#配置其他服务器重试两次
MaxAutoRetriesNextServer: 2
#链接超时时间
ConnectTimeout: 500
#请求处理时间
ReadTimeout: 2000
#每个操作都开启重试机制
OkToRetryOnAllOperations: true
hystrix配置
全局配置
与hystrix配置一样
#配置断路器超时时间,默认是1000(1秒)
hystrix:
command:
default:
execution:
isolation:
thread:
timeoutInMilliseconds: 12000
通过指令配置
hystrix.command.<commandKey> commandKey默认以方法名作为标识
禁用hystrix
全部禁用
feign:
hystrix:
enabled: true #启用hystrix false为禁用
指定服务禁用
@Configuration
public class DisableHystrixConfiguration {
@Bean
@Scope("prototype")
public Feign.Builder feignBuilder() {
return Feign.builder(); }
}
@FeignClient(value = "PROVIDER",configuration = DisableHystrixConfiguration.class)
public interface UserService extends com.liqiang.api.UserService {
}
服务降级
1.增加一个Service的接口类
public class UserServiceFaillBack implements UserService {
@Override
public User findById(Integer id) {
return null;
}
@Override
public List<User> findAll() {
return null;
}
@Override
public Boolean deleteById(Integer id) {
return false;
}
@Override
public Boolean update(User user) {
return false;
}
}
@FeignClient(value = "PROVIDER",configuration = DisableHystrixConfiguration.class,fallback = UserServiceFaillBack.class)
public interface UserService extends com.liqiang.api.UserService {
}
请求压缩
feign:
compression:
request:
enabled: true #feign请求gizp压缩 减少网络损耗
response:
enabled: true #feign响应gizp压缩 减少网络损耗
#启用压缩 压缩指定格式 超过对应大小的才开始压缩
#feign.compression.request.enabled=true
#feign.compression.request.mime-types=text/xml,application/xml,application/json #指定格式
#feign.compression.request.min-request-size=2048 #指定大小
日志配置
对服务开启日志输出
#还需要在application配置Logger.Level 详情区主类去看
logging:
level:
com:
liqiang:
feginService:
HelloExtendService: DEBUG
还要在主类设置日志界别
class SpringcloudFeiginConsumerApplication {
/***
* 日志可选级别
* • NONE: 不记录任何信息。
* • BASIC: 仅记录请求方法、URL以及响应状态码和执行时间。
* • HEADERS: 除了记录BASIC级别的信息之外, 还会记录请求和响应的头信息。
// * • FULL: 记录所有请求与响应的明细, 包括头信息、 请求体、 元数据等。
// * @return
*/
@Bean
public Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
public static void main(String[] args) {
SpringApplication.run(SpringcloudFeiginConsumerApplication.class, args);
}
}

可能遇到的问题
如果遇到feign注解无效,同时配置了scan 包扫描。 可以在@EnableFeignClients("你的feign包")或者application.properties 配置feign.client.package=com.crb.ocms.stock
Spring Cloud-hystrix Feign(九)的更多相关文章
- spring cloud: Hystrix(四):feign类似于hystrix的断容器功能:fallback
spring cloud: Hystrix(四):feign使用hystrix @FeignClient支持回退的概念:fallback方法,这里有点类似于:@HystrixCommand(fallb ...
- Spring Cloud 微服务笔记(六)Spring Cloud Hystrix
Spring Cloud Hystrix Hystrix是一个延迟和容错库,旨在隔离远程系统.服务和第三方库,阻止链接故障,在复杂的分布式系统中实现恢复能力. 一.快速入门 1)依赖: <dep ...
- spring cloud: Hystrix(五):如禁止单个FeignClient使用hystrix
spring cloud: Hystrix(五):如禁止单个FeignClient使用hystrix 首先application.yml / applicatoin.propreties的配置项:fe ...
- spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略
spring cloud: Hystrix(二):简单使用@HystrixCommand的commandProperties配置@HistrixProperty隔离策略 某电子商务网站在一个黑色星期五 ...
- 微服务架构之spring cloud hystrix&hystrix dashboard
在前面介绍spring cloud feign中我们已经使用过hystrix,只是没有介绍,spring cloud hystrix在spring cloud中起到保护微服务的作用,不会让发生的异常无 ...
- spring cloud 使用feign 遇到问题
spring cloud 使用feign 项目的搭建 在这里就不写了,本文主要讲解在使用过程中遇到的问题以及解决办法 1:示例 @RequestMapping(value = "/gener ...
- Spring Cloud 微服务四:熔断器Spring cloud hystrix
前言:在微服务架构中,一般都是进程间通信,有可能调用链都比较长,当有底层某服务出现问题时,比如宕机,会导致调用方的服务失败,这样就会发生一连串的反映,造成系统资源被阻塞,最终可能造成雪崩.在sprin ...
- Spring Cloud Hystrix理解与实践(一):搭建简单监控集群
前言 在分布式架构中,所谓的断路器模式是指当某个服务发生故障之后,通过断路器的故障监控,向调用方返回一个错误响应,这样就不会使得线程因调用故障服务被长时间占用不释放,避免故障的继续蔓延.Spring ...
- 7、Spring Cloud Hystrix
1.Spring Cloud Hystrix简介 (1).分布式问题 复杂分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败. 多个微服务之间调用的时候,假设微服务A调 ...
- Spring Cloud 整合 Feign 的原理
前言 在 上篇 介绍了 Feign 的核心实现原理,在文末也提到了会再介绍其和 Spring Cloud 的整合原理,Spring 具有很强的扩展性,会把一些常用的解决方案通过 starter 的方式 ...
随机推荐
- [RK3288][Android6.0] 调试笔记 --- 普通串口的添加 【转】
本文转载自:http://blog.csdn.net/kris_fei/article/details/54574073 标签: rk3288 串口添加 2017-01-16 14:52 1079 ...
- PCB MS SQL 行转列(动态拼SQL)
一.原数据: SELECT inman,indate FROM [fp_db].[dbo].[ppezhpbb] WHERE indate > '2016-5-1' AND indate < ...
- ecshop数据库说明
数据库 ecshop 表的结构 ecs_account_log 字段 类型 空 默认 含义 log_id mediumint(8) 否 账户记录表 user_id mediumint(8) 否 用户编 ...
- 如何通过免费开源ERP Odoo实现企业数字化转型深度分析(一)
本文来自<开源智造企业数字化转型报告白皮书>的精选内容章节.请勿转载.欢迎您反馈阅读意见. 引言 在由消费者驱动的数字经济时代,创新之势锐不可挡.变革步伐从未如此迅速,并且还会越来越快.对 ...
- jq中append()、prepend()、after()、before()的区别
jq中append().prepend().after().before()的区别详解 .append() - 在被选元素的结尾插入内容(内容的结尾,比如说有个a标签,则是在</a>这个标 ...
- gdb打印vector
1.gdb版本大于7.0 (gdb) p yourVector 2.打印整个vector (gdb) p *(yourVector._M_impl._M_start)@yourVector.size( ...
- 画板(适用于手机、PC端)
Html代码 <script type="text/javascript" src="jquery-1.9.1.min.js"></scrip ...
- OneThink管理平台 ,登录后台一直提示验证码错误
可能是数据库的错.上传到服务器以后要改2个地方的配置,\Application\Common\Conf\config.php(整站公用配置文 件),\Application\User\Conf\con ...
- RabbitMQ 官方NET教程(二)【工作队列】
这篇中我们将会创建一个工作队列用来在工作者(consumer)间分发耗时任务. 工作队列的主要任务是:避免立刻执行资源密集型任务和避免必须等待其完成.相反地,我们进行任务调度:我们把任务封装为消息发送 ...
- Vue蚂蜂窝Vue-cli+webpack做的
先来看下效果 项目地址 喜欢star一下哦