执法局网站建设目的,长沙广告传媒有限公司,合肥设计工作室有哪些,h5免费制作平台哪个好文章目录 业务场景拦截器用法Open Feign介绍 业务场景
我们服务使用Spring Cloud微服务架构#xff0c;使用Spring Cloud Gateway 作为网关#xff0c;使用 Spring Cloud OpenFeign 作为服务间通信方式我们现在做的信控平台#xff0c;主要功能之一就是对路口信号机进行管控… 文章目录 业务场景拦截器用法Open Feign介绍 业务场景
我们服务使用Spring Cloud微服务架构使用Spring Cloud Gateway 作为网关使用 Spring Cloud OpenFeign 作为服务间通信方式我们现在做的信控平台主要功能之一就是对路口信号机进行管控和实时展示平台通过通信服务与信号机设备连接当信号机数量比较多时单个通信服务就会存在性能瓶颈需要将多个通信服务部署到不同的服务器基于我们的业务特性我们需要保证某一台信号机只会和某一个通信服务连接在线、离线、告警等业务需求我们在维护信号机设备时会给它分配一个通信服务。根据实际的业务需求例如不同支队分配到对应的通信服务这样就有了一个信号机设备编号与通信服务的绑定关系由于前期已经有了大量的业务编码这个需求不能大规模改动代码要统一拦截处理由于这个是根据具体的业务需求去分配到不同的服务没有规律没法在网关里判断和转发处理而且我们的服务间调用都是内网也没有经过网关服务于是想到FeignClient的特性在它的拦截器里统一处理根据业务规则实现微服务动态路由路由到需要的服务里
拦截器用法
首先我们看下FeignClient类UnitClient的代码使用了自定义的一个注解AuthorizedFeignClient
AuthorizedFeignClient(name unit, url ${microservices.unit})
Component
public interface UnitClient {/*** 上传数据*/GetMapping(/uploadAllUnit/{unitId})ResponseEntityResponseBean uploadAllUnit(PathVariable String unitId);/*** 关灯*/PostMapping(/lampOffControl/{unitId})ResponseEntityRequestResult lampOffControl(PathVariable String unitId);}
// 其他省略注解类AuthorizedFeignClient其实就是FeignClient基础上指定了一个配置类OAuth2InterceptedFeignConfiguration
package com.newatc.core.client;import java.lang.annotation.*;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.cloud.openfeign.FeignClientsConfiguration;
import org.springframework.core.annotation.AliasFor;Retention(RetentionPolicy.RUNTIME)
Target(ElementType.TYPE)
Documented
FeignClient
public interface AuthorizedFeignClient {AliasFor(annotation FeignClient.class, attribute name)String name() default ;/*** A custom {code Configuration} for the feign client.** Can contain override {code Bean} definition for the pieces that* make up the client, for instance {link feign.codec.Decoder},* {link feign.codec.Encoder}, {link feign.Contract}.** return the custom {code Configuration} for the feign client.* see FeignClientsConfiguration for the defaults.*/AliasFor(annotation FeignClient.class, attribute configuration)Class?[] configuration() default OAuth2InterceptedFeignConfiguration.class;/*** An absolute URL or resolvable hostname (the protocol is optional).* return the URL.*/String url() default ;/*** Whether 404s should be decoded instead of throwing FeignExceptions.* return true if 404s will be decoded; false otherwise.*/boolean decode404() default false;/*** Fallback class for the specified Feign client interface. The fallback class must* implement the interface annotated by this annotation and be a valid Spring bean.* return the fallback class for the specified Feign client interface.*/Class? fallback() default void.class;/*** Path prefix to be used by all method-level mappings.* return the path prefix to be used by all method-level mappings.*/String path() default ;
}
配置类OAuth2InterceptedFeignConfiguration这里指定了拦截器TokenRelayRequestInterceptor
package com.newatc.core.client;import feign.RequestInterceptor;
import org.springframework.context.annotation.Bean;public class OAuth2InterceptedFeignConfiguration {Bean(name oauth2RequestInterceptor)public RequestInterceptor getOAuth2RequestInterceptor() {return new TokenRelayRequestInterceptor();}
}
找到了open feign接口现在用的拦截器在拦截器里修改代码即可通过修改URL路由到对应的服务以下两种都可以template.target(host)template.feignTarget(new Target.HardCodedTarget(target.type(), target.name(), host);总结一下查看下使用FeignClient注解的类有没有指定配置和拦截器找到拦截器在拦截器里重新指定RequestTemplate的目标路由即可
Open Feign介绍
OpenFeign是一个基于Java的声明式HTTP客户端它简化了编写基于HTTP的API的代码。它使用了注解来定义和配置HTTP API并且自动地将这些API转换为相应的HTTP请求。
OpenFeign的特点包括 声明式API使用Java接口和注解定义和配置HTTP API无需手动拼接URL和参数。 支持多种编码器支持多种编码器包括常见的JSON和XML编码器以及自定义的编码器。 内置负载均衡集成了Ribbon负载均衡器可以轻松地对请求进行负载均衡。 支持熔断器集成了Hystrix熔断器可以在服务不可用时阻止不稳定的网络请求。 易于集成可以轻松地集成到Spring应用中也可以独立使用。
通过使用OpenFeign开发人员可以更加简单地与其他服务进行通信而不需要手动编写大量的HTTP请求代码。这使得开发人员可以更加专注于业务逻辑的实现提高了开发效率。