360网站推广费用,平面设计好还是电商设计好,可以优化网络的软件,网站开发后台指什么目录 一、需求与背景二、OpenFeign 远程调用技术原理三、项目代码演示3.1 引入依赖3.2 实现OpenFeign注解修饰接口3.3 指定 OpenFeign 远程调用接口的扫描路径 四、OpenFeign 在日志中打印Request和Response五、OpenFeign 客户端超时配置六、使用 OpenFeign 实现服务降级6.1 实… 目录 一、需求与背景二、OpenFeign 远程调用技术原理三、项目代码演示3.1 引入依赖3.2 实现OpenFeign注解修饰接口3.3 指定 OpenFeign 远程调用接口的扫描路径 四、OpenFeign 在日志中打印Request和Response五、OpenFeign 客户端超时配置六、使用 OpenFeign 实现服务降级6.1 实现降级6.1.1 引入依赖6.1.2 降级方式一6.1.2 降级方式二 6.2 开启降级配置 一、需求与背景
在分布式系统的场景下大多数服务的拆分要进行微服务化各微服务的内部不可能直接依赖其它微服务的实现而是将该微服务内的POJO 类提取到一个公共模块供其它的微服务进行依赖。为了让代码的职责更加明确实现更加清晰就需要将业务代码与框架使用的模版代码分离让开发人员将精力集中到业务功能的实现上。
二、OpenFeign 远程调用技术原理
OpenFeign 是 Netflix 开源的一个项目可以将远程的接口调用转换成本地调用的形式简化了开发并且做到了业务功能代码与框架模版代码分离的效果。OpenFeign 的使用核心是基于 FeignClient 、EnableFeignClients 这2个注解。EnableFeignClients 注解加在项目的启动类上当项目在启动时会扫描注解中指定的目录会为所有使用了 FeignClient 注解的接口创建一个动态代理对象这些被创建的动态代理对象从属于FeignClient注解所修饰的接口的实例并把这些动态代理对象加载到 Spring 的 Bean 容器内随后会被注入到需要进行远程调用的本地服务对象内。
三、项目代码演示
接下来使用一个积分项目进行演示。这个项目分为3个微服务商品goods、用户customer、计算caculation。用户通过购买商品获取积分不同的商品可能参加了不同的活动有的商品不赠送积分不同的用户等级可能通过购物获取的积分不同。
3.1 引入依赖
要使用 openFeign 组件首先我们需要先引入相应的依赖。注意使用openFeign 还需要引入loadBalancer 的依赖
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-loadbalancer/artifactId
/dependency
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-openfeign/artifactId
/dependency由于在父项目中已经引入了 spring-cloud-dependencies 的依赖上述2个组件的版本号可通过版本仲裁确定无需指定。
3.2 实现OpenFeign注解修饰接口
实现OpenFeign组件的远程调用首先需要实现FeignClient 注解修饰的接口该接口会将本地调用转化成远程的接口调用。
FeignClient(value coin-goods-svc, path /goods)
public interface GoodsService {// 获取指定商品GetMapping(/getGoods)GoodsInfo getGoods(RequestParam(id) Long id);// 获取整个购物车内的商品GetMapping(/getBatch)MapLong, GoodsCart getGoodsCart(RequestParam(ids) CollectionLong ids);
}原来我们是直接通过 webclient 直接发起的远程接口调用内容如下
webClientBuilder.build().get().uri(http://coin-goods-svc/goods/getGoods?id id).retrieve().bodyToMono(GoodsInfo.class).block(); 现在我们直接注入 GoodsService 并调取对应方法
Autowired
private GoodsService goodsService;public Integer getGoodsCoin(Long id) {// 忽略无关逻辑// 获取指定商品GoodsInfo goods goodsService.getGoods(id);
}现在我们不必再业务代码里面指定调用接口的URI 和 Method 了做到了代码的职责分离。
3.3 指定 OpenFeign 远程调用接口的扫描路径
接下来我们需要在微服务的启动类上加上 EnableFeignClients 注解这样服务启动时的才会扫描指定目录下使用了 FeignClient 注解的接口并为其生成对应的动态代理实例。
// 省略其它注解
EnableFeignClients(basePackages {com.fyup})
public class CustomerApplication{// 忽略具体实现
}我们也可以不指定具体的扫描路径而是直接指定要进行代理的接口不过这种方式在 OpenFeign 远程调用接口较多时会很麻烦不具备扩展性不符合开闭原则。
// 通过指定具体的远程调用接口
// 省略其它注解
EnableFeignClients(clients {GoodsService.class})
public class CustomerApplication{// 忽略具体实现
}四、OpenFeign 在日志中打印Request和Response
OpenFeign 还提供了在日志中打印远程调用细节的功能只需要开启相应配置并向 Spring Bean 容器内注册对应的 Bean 即可。可打印的日志分为4个级别这里贴一下源码的截图 如上所示如果我们选择 Level.FULL 级别会打印完整的 Request 和 Response 的 Header、Body。 因为 OpenFeign 组件内的日志都是以 Debug 级别输出的所以我们需要现将对应的远程调用接口的日志输出级别打开。
logging:level:com.fyup.coin.customer.feign.GoodsService: debug因为要打印完整的 URL、Method、以及Request 和 Response 的 Header、Body 等信息所以还需要在配置类中注入 Level.FULL 的 Bean。实现如下
Bean
Logger.Level feignLogger() {return Logger.Level.FULL;
}五、OpenFeign 客户端超时配置
接口超时不响应会悬挂消费者请求大量的请求超时未响应会给系统造成很大压力在调用链路过长的情况下可能会在系统内部产生雪崩反应。 我们可以在Feign客户端的application.yml 文件中的 feign.client.config 配置项配置Feign 客户端远程调用的超时时间。feign.client.config.default 配置项配置全局的超时时间通过 feign.client.config.${serviceName} 配置访问某个特定微服务的超时时间。 示例配置如下
# 其它忽略
feign:client:config:# 全局超时配置default:connectTimeout: 1000readTimeout: 3000# 针对coin-goods-svc服务的超时配置coin-goods-svc:connectTimeout: 1000readTimeout: 2000其中connectTimeout 表示的是服务消费者与服务提供者建立远程连接的超时时间 readTimeout 是指从发出请求开始到服务端响应请求之前为客户端设置的请求超时时间。
六、使用 OpenFeign 实现服务降级
我们也可以使用 OpenFeign 组件实现服务降级用法就是使用 FeignClient 注解修饰远程调用接口时使用 FiegnClient 注解的 fallback 属性或者 fallbackFactory 属性指定降级方法的降级类即可。
6.1 实现降级
6.1.1 引入依赖
因为OpenFeign 实现服务降级依赖于 hystrix 因此我们需要先引入hystrix 依赖如下
dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-hystrix/artifactIdversion2.2.9.RELEASE/versionexclusionsexclusiongroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-netflix-ribbon/artifactId/exclusion/exclusions
/dependency6.1.2 降级方式一
下面实现了一个降级类示例该降级类是通过 FiegnClient 注解的 fallback 属性来指定的
Slf4j
Component
public class GoodsServiceDowngrade implements GoodsService {// 获取指定商品Overridepublic GoodsInfo getGoods(Long id) {// 对应的远程调用方法执行失败后会调用该方法根据业务情况自行设计实现细节此处仅打印日志log.info(fallback method in getGoods.);return null;}// 获取整个购物车内的商品Overridepublic MapLong, GoodsCart getGoodsCart(CollectionLong ids) {// 对应的远程调用方法执行失败后会调用该方法根据业务情况自行设计实现细节此处仅打印日志log.info(fallback method in getGoodsCart.);return null;}
}接下来在远程调用接口内指定降级类
FeignClient(value coin-goods-svc, path /goods, fallbackGoodsServiceDowngrade.class)
public interface GoodsService {// 获取指定商品GetMapping(/getGoods)GoodsInfo getGoods(RequestParam(id) Long id);// 获取整个购物车内的商品GetMapping(/getBatch)MapLong, GoodsCart getGoodsCart(RequestParam(ids) CollectionLong ids);
}6.1.2 降级方式二
下面实现的降级类是通过 FiegnClient 注解的 fallbackFactory 属性来指定的与上面不同的是使用降级工厂处理降级可以获取到远程调用方法失败的原因。
Slf4j
Component
public class GoodsServiceDowngradeFactory implements FallbackFactoryGoodsService {Overridepublic GoodsService create(Throwable cause) {return new GoodsService() {Overridepublic GoodsInfo getGoods(Long id) {// 根据业务情况自行设计实现细节此处仅打印日志log.info(fallback method in getGoods., cause);return null;}Overridepublic MapLong, GoodsCart getGoodsCart(CollectionLong ids) {log.info(fallback method in getGoodsCart., cause);return null;}};}
}下面我们在FeignClient 注解修饰的远程调用接口内使用我们实现的降级工厂
FeignClient(value coin-goods-svc, path /goods, fallbackFactoryGoodsServiceDowngradeFactory.class)
public interface GoodsService {// 获取指定商品GetMapping(/getGoods)GoodsInfo getGoods(RequestParam(id) Long id);// 获取整个购物车内的商品GetMapping(/getBatch)MapLong, GoodsCart getGoodsCart(RequestParam(ids) CollectionLong ids);
}注意我们在使用的时候降级类和降级工厂同时只能选择其中一种。
6.2 开启降级配置
最后一步开启降级的配置开关feign.circuitbreaker.enabled: true使代码生效。即在 application.yml 文件中原来的配置中加上
# 其它忽略
feign:client:config:# 全局超时配置default:connectTimeout: 1000readTimeout: 3000# 针对coin-goods-svc服务的超时配置coin-goods-svc:connectTimeout: 1000readTimeout: 2000circuitbreaker:enabled: true
文章转载自: http://www.morning.lfdzr.cn.gov.cn.lfdzr.cn http://www.morning.nba1on1.com.gov.cn.nba1on1.com http://www.morning.yxlhz.cn.gov.cn.yxlhz.cn http://www.morning.prznc.cn.gov.cn.prznc.cn http://www.morning.tlrxp.cn.gov.cn.tlrxp.cn http://www.morning.fnjrh.cn.gov.cn.fnjrh.cn http://www.morning.dfffm.cn.gov.cn.dfffm.cn http://www.morning.mprky.cn.gov.cn.mprky.cn http://www.morning.wtnyg.cn.gov.cn.wtnyg.cn http://www.morning.trbxt.cn.gov.cn.trbxt.cn http://www.morning.fwwkr.cn.gov.cn.fwwkr.cn http://www.morning.csnch.cn.gov.cn.csnch.cn http://www.morning.zxqqx.cn.gov.cn.zxqqx.cn http://www.morning.mzcrs.cn.gov.cn.mzcrs.cn http://www.morning.lzdbb.cn.gov.cn.lzdbb.cn http://www.morning.hhzdj.cn.gov.cn.hhzdj.cn http://www.morning.tlfmr.cn.gov.cn.tlfmr.cn http://www.morning.gjzwj.cn.gov.cn.gjzwj.cn http://www.morning.kycxb.cn.gov.cn.kycxb.cn http://www.morning.brfxt.cn.gov.cn.brfxt.cn http://www.morning.kzhxy.cn.gov.cn.kzhxy.cn http://www.morning.zcqbx.cn.gov.cn.zcqbx.cn http://www.morning.gqfbh.cn.gov.cn.gqfbh.cn http://www.morning.rgwrl.cn.gov.cn.rgwrl.cn http://www.morning.xwlmg.cn.gov.cn.xwlmg.cn http://www.morning.xtxp.cn.gov.cn.xtxp.cn http://www.morning.wgtr.cn.gov.cn.wgtr.cn http://www.morning.osshjj.cn.gov.cn.osshjj.cn http://www.morning.mrfbp.cn.gov.cn.mrfbp.cn http://www.morning.brzlp.cn.gov.cn.brzlp.cn http://www.morning.pdmsj.cn.gov.cn.pdmsj.cn http://www.morning.rbgqn.cn.gov.cn.rbgqn.cn http://www.morning.xbyyd.cn.gov.cn.xbyyd.cn http://www.morning.bynf.cn.gov.cn.bynf.cn http://www.morning.kchwr.cn.gov.cn.kchwr.cn http://www.morning.zsrdp.cn.gov.cn.zsrdp.cn http://www.morning.tzmjc.cn.gov.cn.tzmjc.cn http://www.morning.nkqnn.cn.gov.cn.nkqnn.cn http://www.morning.zrwlz.cn.gov.cn.zrwlz.cn http://www.morning.mfzyn.cn.gov.cn.mfzyn.cn http://www.morning.pwdmz.cn.gov.cn.pwdmz.cn http://www.morning.mxmtt.cn.gov.cn.mxmtt.cn http://www.morning.xqtqm.cn.gov.cn.xqtqm.cn http://www.morning.3ox8hs.cn.gov.cn.3ox8hs.cn http://www.morning.wwwghs.com.gov.cn.wwwghs.com http://www.morning.kyjpg.cn.gov.cn.kyjpg.cn http://www.morning.rbkl.cn.gov.cn.rbkl.cn http://www.morning.bbgn.cn.gov.cn.bbgn.cn http://www.morning.twfdm.cn.gov.cn.twfdm.cn http://www.morning.brkrt.cn.gov.cn.brkrt.cn http://www.morning.xwbld.cn.gov.cn.xwbld.cn http://www.morning.rrpsw.cn.gov.cn.rrpsw.cn http://www.morning.mrskk.cn.gov.cn.mrskk.cn http://www.morning.rbnj.cn.gov.cn.rbnj.cn http://www.morning.pqcsx.cn.gov.cn.pqcsx.cn http://www.morning.kkjhj.cn.gov.cn.kkjhj.cn http://www.morning.mnkz.cn.gov.cn.mnkz.cn http://www.morning.qsy36.cn.gov.cn.qsy36.cn http://www.morning.nhpgm.cn.gov.cn.nhpgm.cn http://www.morning.pwdgy.cn.gov.cn.pwdgy.cn http://www.morning.ydfr.cn.gov.cn.ydfr.cn http://www.morning.tsdqr.cn.gov.cn.tsdqr.cn http://www.morning.ygqjn.cn.gov.cn.ygqjn.cn http://www.morning.wjndl.cn.gov.cn.wjndl.cn http://www.morning.ldnrf.cn.gov.cn.ldnrf.cn http://www.morning.kwz6232.cn.gov.cn.kwz6232.cn http://www.morning.bpkqd.cn.gov.cn.bpkqd.cn http://www.morning.nrqtk.cn.gov.cn.nrqtk.cn http://www.morning.yzxlkj.com.gov.cn.yzxlkj.com http://www.morning.trpq.cn.gov.cn.trpq.cn http://www.morning.nfpct.cn.gov.cn.nfpct.cn http://www.morning.zqzhd.cn.gov.cn.zqzhd.cn http://www.morning.txhls.cn.gov.cn.txhls.cn http://www.morning.lgnz.cn.gov.cn.lgnz.cn http://www.morning.bytgy.com.gov.cn.bytgy.com http://www.morning.xfrqf.cn.gov.cn.xfrqf.cn http://www.morning.ykrg.cn.gov.cn.ykrg.cn http://www.morning.xgxbr.cn.gov.cn.xgxbr.cn http://www.morning.bxbnf.cn.gov.cn.bxbnf.cn http://www.morning.ngmjn.cn.gov.cn.ngmjn.cn