【SpringCloud】SpringCloud教程之Feign实战
创始人
2024-05-28 16:51:53
0

目录

  • 前言
  • SpringCloud Feign远程服务调用
    • 一.需求
    • 二.两个服务的yml配置和访问路径
    • 三.使用RestTemplate远程调用(order服务内编写)
    • 四.构建Feign(order服务内配置)
    • 五.自定义Feign配置(order服务内配置)
    • 六.Feign配置日志(oder服务内配置)
    • 七.Feign调优(order服务内配置)
    • 八.抽离Feign

前言

微服务分解成多个不同的服务,那么多个服务之间怎么调用呢?(想要微服务项目点赞收藏评论找我拿)
SpringCloud组件原理和面试题

SpringCloud Feign远程服务调用

一.需求

现在有两个服务,订单服务和用户服务,分别对应不同的数据库。
在 查询订单的时候,把所属的用户信息一起查出来。
在这里插入图片描述

二.两个服务的yml配置和访问路径

用两个不同的数据库,模拟部署在两台服务器的数据库订单yml配置   访问路径:@GetMapping("order/{orderId}")
server:port: 8082
spring:datasource:url: jdbc:mysql://localhost:3306/cloud_order?useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driverapplication:name: orderservice //订单服务的名称用户yml配置  访问路径:@GetMapping("user/{id}")
server:port: 8081
spring:datasource:url: jdbc:mysql://localhost:3306/cloud_user?useSSL=falseusername: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driverapplication:name: userservice //用户服务的名称

三.使用RestTemplate远程调用(order服务内编写)

1.注入RestTemplate

	/*** 因为启动类本身也是一个配置了,所以我们在启动类进行注入,你自己自定义配置类注入也行* 创建RestTemplate并注入Spring容器*/@Bean@LoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}

2.编写远程调用

@Autowiredprivate RestTemplate restTemplate;public Order queryOrderById(Long orderId) {// 根据订单id查询订单Order order = orderMapper.findById(orderId);// 利用RestTemplate发起http请求,根据用户id查询用户// url路径  http://服务名称(上面配置了)/请求路径/参数String url = "http://localhost:8081/user/" + order.getUserId();// 发送http请求,实现远程调用,现在是get请求类型User user = restTemplate.getForObject(url, User.class);// 封装user到Orderorder.setUser(user);// 返回值return order;}

3.RestTemplate的缺点

  • 参数复杂URL难以维护。
  • 不符合正常接口调用的格式。

四.构建Feign(order服务内配置)

1.引入依赖

		org.springframework.cloudspring-cloud-starter-openfeign

2.在启动类使用注解开启Feign功能

@SpringBootApplication
@EnableFeignClients
public class OrderApplication {
}

3.编写远程调用(在order项目内编写)

//服务名称
@FeignClient(value = "userservice")
public interface UserClient {@GetMapping("/user/{id}")User findById(@PathVariable("id") Long id);}

4.调用接口

@Autowiredprivate UserClient userClient;public Order queryOrderById(Long orderId) {// 根据订单id查询订单Order order = orderMapper.findById(orderId);// 用Feign远程调用User user = userClient.findById(order.getUserId());// 封装user到Orderorder.setUser(user);// 返回return order;}

5.Feign还集成了Ribbon,所以我们不用考虑负载均衡问题

在这里插入图片描述

五.自定义Feign配置(order服务内配置)

类型作用说明
feign.Logger.Level修改日志级别四种不同的级别:NONE(没有任何日志)、BASIC(发起请求的开始结束时间)、HEADERS(会记录请求头请求体)、FULL(请求和响应信息)
feign.codec.Decoder响应结果的解析器http远程调用的结果做解析,例如解析json字符串为java对象
feign.codec.Encoder请求参数编码将请求参数编码,便于通过http请求发送
feign. Contract支持的注解格式默认是SpringMVC的注解
feign. Retryer失败重试机制请求失败的重试机制,默认是没有,不过会使用Ribbon的重试

一般我们自定义配置的是日志

六.Feign配置日志(oder服务内配置)

1.配置文件配置日志

//全局配置
feign:client:config:default://default全局配置,远程调用的服务的接口也会打印。loggerLevel:FULL //日志级别//局部配置
feign:client:config:orderservice://只打印服务名为orderservice的日志。loggerLevel:FULL //日志级别

2.代码方式配置日志

//第一步:注入对象
public class DefaultFeignConfiguration {@Beanpublic Logger.Level logLevel(){//日志级别return Logger.Level.BASIC;}
}
//第二步:注解配置//全局配置
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)//局部配置
@FeignClient(value = "userservice",confiquration = FeignClientConfiguration.class)

七.Feign调优(order服务内配置)

Feign底层客户端实现:

  • URLConnection:默认实现,不支持连接池。
  • Apache HttpClient: 支持连接池。
  • OKHttp:支持连接池。

1.使用连接池替代默认的URL Connection(使用HttpClient支持)

①pom文件引入依赖

	    io.github.openfeignfeign-httpclient

②yml文件进行配置

feign:httpclient:enabled: true # 支持HttpClient的开关max-connections: 100 # 最大连接数max-connections-per-route: 25 # 单个路径的最大连接数

2.日志级别最好是basic或none

八.抽离Feign

比如 订单、商品、库存服务都要调用用户服务,那我们都需要重复写Feign调用用户服务,这样造成了很多代码冗余,所以我们要把Feign抽离出来放在一个公共的服务里面。我们新建一个 Feign-api服务,然后谁用谁就在pom文件引入一下。

		cn.xinxin.demofeign-api1.0

但是这样做会导致SpringBootApplication在扫描包时找不到定义FeignClient对象,那么怎么解决呢?

解决

方式一:指定FeignClient所在包
@EnableFeignClients(basePackages = "cn.xinxin.feign.clients")方式二:指定FeignClient字节码
EnableFeignClients(clients = {UserClient.class})

Feign-api结构目录
在这里插入图片描述

Feign的pom文件


cloud-democn.xinxin.demo1.04.0.0feign-api88org.springframework.cloudspring-cloud-starter-openfeign

相关内容

热门资讯

Python|位运算|数组|动... 目录 1、只出现一次的数字(位运算,数组) 示例 选项代...
张岱的人物生平 张岱的人物生平张岱(414年-484年),字景山,吴郡吴县(今江苏苏州)人。南朝齐大臣。祖父张敞,东...
西游西后传演员女人物 西游西后传演员女人物西游西后传演员女人物 孙悟空 六小龄童 唐僧 徐少华 ...
名人故事中贾岛作诗内容简介 名人故事中贾岛作诗内容简介有一次,贾岛骑驴闯了官道.他正琢磨着一句诗,名叫《题李凝幽居》全诗如下:闲...
和男朋友一起优秀的文案? 和男朋友一起优秀的文案?1.希望是惟一所有的人都共同享有的好处;一无所有的人,仍拥有希望。2.生活,...
戴玉手镯的好处 戴玉手镯好还是... 戴玉手镯的好处 戴玉手镯好还是碧玺好 女人戴玉?戴玉好还是碧玺好点佩戴手镯,以和田玉手镯为佳!相嫌滑...
依然什么意思? 依然什么意思?依然(汉语词语)依然,汉语词汇。拼音:yī    rán基本解释:副词,指照往常、依旧...
高尔基的散文诗 高尔基的散文诗《海燕》、《大学》、《母亲》、《童年》这些都是比较出名的一些代表作。
心在飞扬作者简介 心在飞扬作者简介心在飞扬作者简介如下。根据相关公开资料查询,心在飞扬是一位优秀的小说作者,他的小说作...
卡什坦卡的故事赏析? 卡什坦卡的故事赏析?讲了一只小狗的故事, 我也是近来才读到这篇小说. 作家对动物的拟人描写真是惟妙...
林绍涛为简艾拿绿豆糕是哪一集 林绍涛为简艾拿绿豆糕是哪一集第三十二集。 贾宽认为是阎帅间接导致刘映霞住了院,第二天上班,他按捺不...
小爱同学是女生吗小安同学什么意... 小爱同学是女生吗小安同学什么意思 小爱同学,小安同学说你是女生。小安是男的。
内分泌失调导致脸上长斑,怎么调... 内分泌失调导致脸上长斑,怎么调理内分泌失调导致脸上长斑,怎么调理先调理内分泌,去看中医吧,另外用好的...
《魔幻仙境》刺客,骑士人物属性... 《魔幻仙境》刺客,骑士人物属性加点魔幻仙境骑士2功1体质
很喜欢她,该怎么办? 很喜欢她,该怎么办?太冷静了!! 太理智了!爱情是需要冲劲的~不要考虑着考虑那~否则缘...
言情小说作家 言情小说作家我比较喜欢匪我思存的,很虐,很悲,还有梅子黄时雨,笙离,叶萱,还有安宁的《温暖的玄》 小...
两个以名人的名字命名的风景名胜... 两个以名人的名字命名的风景名胜?快太白楼,李白。尚志公园,赵尚志。
幼儿教育的代表人物及其著作 幼儿教育的代表人物及其著作卡尔威特的《卡尔威特的教育》,小卡尔威特,他儿子成了天才后写的《小卡尔威特...
海贼王中为什么说路飞打凯多靠霸... 海贼王中为什么说路飞打凯多靠霸气升级?凯多是靠霸气升级吗?因为之前刚到时确实打不过人家因为路飞的实力...
运气不好拜财神有用吗运气不好拜... 运气不好拜财神有用吗运气不好拜财神有没有用1、运气不好拜财神有用。2、拜财神上香前先点蜡烛,照亮人神...