当前位置:网站首页>OpenFeign使用步骤 轮询策略与权重 log4j使用 openFeign拦截器的配置
OpenFeign使用步骤 轮询策略与权重 log4j使用 openFeign拦截器的配置
2022-06-29 17:21:00 【kjshuan】
调用组件Feign(openFeign)
JAVA 项目中如何实现接口调用? 1)Httpclient HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富 的支持 Http 协议的客户端编程工具包,并且它支持 HTTP 协议最新版本和建议。HttpClient 相比传统 JDK 自带的 URLConnection,提升了易用性和灵活性,使客户端发送 HTTP 请求变得容易,提高了开发的效率。 2)Okhttp 一个处理网络请求的开源项目,是安卓端最火的轻量级框架,由 Square 公司贡献,用于替代HttpUrlConnection 和 Apache HttpClient。OkHttp 拥有简洁的 API、高效的性能,并支持多种协议(HTTP/2 和 SPDY)。 3)HttpURLConnection HttpURLConnection 是 Java 的标准类,它继承自 URLConnection,可用于向指定网站发送GET 请求、POST 请求。HttpURLConnection 使用比较复杂,不像 HttpClient 那样容易使用。 4)RestTemplate WebClient RestTemplate 是 Spring 提供的用于访问 Rest 服务的客户端,RestTemplate 提供了多种便捷访问远程 HTTP 服务的方法,能够大大提高客户端的编写效率。 上面介绍的是最常见的几种调用接口的方法,我们下面要介绍的方法比上面的更简单、方便, 它就是 Feign。
什 么 是 Feign (这里特指openFeign)
1.Feign是Netflix开发的声明式、模板化的HTTP客户端,其灵感来自Retrofit、JAXRS-2.0以及WebSocket。Feign可帮助我们更加便捷、优雅地调用HTTP API。 Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。 #!!!!!!!!!!!!!!!!!!!!! Spring Cloud openfeign对Feign进行了增强,使其支持Spring MVC注解,另外还整合了Ribbon和Nacos,从而使得Feign的使用更加方便 优势 Feign可以做到使用 HTTP 请求远程服务时就像调用本地方法一样的体验,开发者完全感知不到这是远程方法,更感知不到这是个 HTTP 请求。它像 Dubbo 一样,consumer 直接调用接口方法调用 provider,而不需要通过常规的 Http Client 构造请求再解析返回数据。它解决了让开发者调用远程接口就跟调用本地方法一样,无需关注与远程的交互细节,更无需关注分布 式环境开发。
怎么使用?
linux直接启动nacos #启动 startup.sh #打开浏览器 192.168.64.200:8848/nacos/#/login#输入地址执行订单 库存扣减 http://localhost:12002/order-server/addorder
使用步骤
第一步 引入依赖
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency>
二步 编写调用接口[email protected]注解
@FeignClient(value = "stockserv",path = "/stock-server") public interface StockFeignService { @RequestMapping("/reduced") public String reduced(); }
第三步 调用端在启动类上添加@EnableFeignClients注解
@SpringBootApplication @EnableFeignClients public class OrderFeignApplication { public static void main(String[] args) { SpringApplication.run(OrderFeignApplication.class,args); } }
第四步 发起调用,像调用本地方式一样调用远程服务
@RestController @RequestMapping("/order-server") public class OrderCtrl { @Resource private StockFeignService stockFeignService; @Value("${dev.stock.baseurl}") private String baseUrl; @Value("${dev.stock.module.apiaddr[0]}") private String reduceStock; @GetMapping("/addorder") public String adds(){ return "添加订单111111111,"+stockFeignService.reduced(); } }
配完自带轮询(一个一个排队查)
如果要走权重 如下4种方式
其中application中2种
###application类中第一种 ##配置application @SpringBootApplication @EnableFeignClients //@RibbonClients(value={ // @RibbonClient(name="stockserv",configuration= RibbonRule.class) //}) public class OrderFeignApplication { public static void main(String[] args) { SpringApplication.run(OrderFeignApplication.class,args); } } ##配置rules类系统自带的权重 @Configuration public class RibbonRule { //手动权重 @Bean public IRule iRule(){ // return new NacosRule(); //自动权重 return new RandomRule(); } } ###application类中第二种 ##配置application @SpringBootApplication @EnableFeignClients //@RibbonClients(value={ // @RibbonClient(name="stockserv",configuration= MyNacosRule.class) //}) public class OrderFeignApplication { public static void main(String[] args) { SpringApplication.run(OrderFeignApplication.class,args); } } ##配置rules类自定义的权重 public class MyNacosRule extends AbstractLoadBalancerRule { @Autowired private NacosDiscoveryProperties nacosDiscoveryProperties; @Override public Server choose(Object o) { //从注册中心上获取动态服务列表 DynamicServerListLoadBalancer lb= (DynamicServerListLoadBalancer)getLoadBalancer(); //获取服务名 String serverName = lb.getName(); //构建服务名实例 NamingService ns = nacosDiscoveryProperties.namingServiceInstance(); //nacos基于权重的算法 try { Instance instance = ns.selectOneHealthyInstance(serverName); //放入服务器 return new NacosServer(instance); } catch (NacosException e) { e.printStackTrace(); } //如果出现问题 则返回用户null return null; } @Override public void initWithNiwsConfig(IClientConfig iClientConfig) { } }
yum中一种
#配置yum stockserv: ribbon: NFLoadBalancerRuleClassName: com.kgc.rrules.MyNacosRule ##配置rules类自定义的权重 public class MyNacosRule extends AbstractLoadBalancerRule { @Autowired private NacosDiscoveryProperties nacosDiscoveryProperties; @Override public Server choose(Object o) { //从注册中心上获取动态服务列表 DynamicServerListLoadBalancer lb= (DynamicServerListLoadBalancer)getLoadBalancer(); //获取服务名 String serverName = lb.getName(); //构建服务名实例 NamingService ns = nacosDiscoveryProperties.namingServiceInstance(); //nacos基于权重的算法 try { Instance instance = ns.selectOneHealthyInstance(serverName); //放入服务器 return new NacosServer(instance); } catch (NacosException e) { e.printStackTrace(); } //如果出现问题 则返回用户null return null; } @Override public void initWithNiwsConfig(IClientConfig iClientConfig) { } }
log4j使用
debug-->调试使用 info-->一般情况下使用 warn--> error-->
第一种 配置日志类
@Configuration //配置日志类 public class LogConf { @Bean public Logger.Level feignLoggerLevel(){ return Logger.Level.FULL; } }
第二种 配置yum文件
logging: level: com.kgc.mynacos.orderfeignserv.remoteserv: debug feign: client: config: stockserv: loggerLevel: Full1feign: 2client: 3config: 4mall‐order: #对应微服务 5loggerLevel: FULL 6contract: feign.Contract.Default #指定Feign原生注解契约配置
自定义拦截器实现认证逻辑
第一步
@Configuration //配置日志类 拦截器 public class LogConf { // @Bean // public Logger.Level feignLoggerLevel(){ // return Logger.Level.FULL; // } @Bean public AddTokenInterceptor addTokenInterceptor(){ return new AddTokenInterceptor(); } }
第二步
#配置拦截器实体类继承 openfign自带的拦截器请求 public class AddTokenInterceptor implements RequestInterceptor { @Override public void apply(RequestTemplate requestTemplate) { //消费方在请求 桩服务时候在头上添加一个获得的TOKEN String token = UUID.randomUUID().toString(); System.out.println("消费端拦截器启动,在头部添加token:"+token); requestTemplate.header("token",token); } }
第三步
#配置yum server: port: 12002 spring: application: name: orderfeginserv cloud: nacos: discovery: server-addr: 192.168.64.200:8848 username: nacos password: nacos namespace: public #dev: # stock: # baseurl: http://stockserv/ # module: # apiaddr: # - /stock-server/reduced stockserv: ribbon: NFLoadBalancerRuleClassName: com.alibaba.cloud.nacos.ribbon.NacosRule #logging: # level: # com.kgc.mynacos.orderfeignserv.remoteserv: debug #feign: # client: # config: # stockserv: # loggerLevel: Full #-----------------------------------------以下是必写的 feign: client: config: orderfeignserv: requestInterceptors: - com.kgc.mynacos.orderser.interceptor.AddTokenInterceptor
#启动浏览器
http://localhost:12002/order-server/addorder
请求头: 一般放校验参数 cookie 请去方式 状态 地址
为什么nginx采用多进程结构而不是多线程结构?
nginx目的:保持高可用性和高可靠性。 如果采用多线程模型,线程之间共享地址空间,如果某个第三方模块引发地址空间导致的段错误时,在地址越界出现时,会导致整个nginx全部挂掉。而多进程就不会出现这种问题。Nginx服务器的负载均衡策略可以划分为两大类:即内置策略和扩展策略。内置策略主要包含轮询、加权轮询和IP hash三种;扩展策略主要通过第三方模块实现,种类比较丰富,常见的有url hash、fair等。
边栏推荐
- 正则表达式
- mysql游标的作用是什么
- InheritableThreadLocal 在线程池中进行父子线程间消息传递出现消息丢失的解析
- What are the Commonwealth countries
- R语言dplyr包filter函数通过组合逻辑(与逻辑)过滤dataframe数据中的数据、其中一个字段的内容等于指定向量中的其中一个,并且另外一个字段值大于某一阈值
- 关于Go中两个模块互相调用的场景解决方案
- Issue 42: is it necessary for MySQL to have multiple column partitions
- 深圳内推 | 深圳计算科学研究院招聘机器学习助理工程师(校招)
- Master slave replication of MySQL
- 在线文本数字识别列表求和工具
猜你喜欢
函数计算异步任务能力介绍 - 任务触发去重
[R language data science]: Text Mining (taking Trump's tweet data as an example)
PCB板框的绘制——AD19
SpingMVC请求和响应
mysql.sock的概念是什么
如何创建虚拟形象
LeetCode 每日一题——535. TinyURL 的加密与解密
Calibration of monocular camera and binocular camera with kalibr calibration tool
可转债策略之---(摊饼玩法,溢价玩法,强赎玩法,下修玩法,双低玩法)
0基础自学STM32(野火)——寄存器点亮LED
随机推荐
mysql视图能不能创建索引
腾讯云发布自动化交付和运维产品Orbit,推动企业应用全面云原生化
Interrupt怎么用
epoll分析
ICML 2022 | transferable imitation learning method based on decoupling gradient optimization
NVIDIA安装最新显卡驱动
Word2vec vector model of Wiki Chinese corpus based on deep learning
MySQL触发器如何创建与删除
研究所的这些优势真香!上岸率还极高!
R语言使用MASS包的glm.nb函数建立负二项广义线性模型(negative binomial)、summary函数获取负二项广义线性模型模型汇总统计信息
R语言dplyr包filter函数通过组合逻辑(与逻辑)过滤dataframe数据中的数据、其中一个字段的内容等于指定向量中的其中一个,并且另外一个字段值大于某一阈值
windows平台下的mysql启动等基本操作
@Component与@Configuration区别
About harbor private warehouse forgetting the login password
A user level thread library based on C language
知道创宇为能源行业资产管理助力,入选工信部2021物联网示范项目
SpingMVC请求和响应
InheritableThreadLocal 在线程池中进行父子线程间消息传递出现消息丢失的解析
基于汇编实现的流载体的LSB隐藏项目
Why is informatization ≠ digitalization? Finally someone made it clear