开发者学堂课程【全面讲解 Spring Cloud Alibaba 技术栈(知识精讲+项目实战)第二阶段:基于Fegin实现服务调用】学习笔记与课程紧密联系,让用户快速学习知识
课程地址:https://developer.aliyun.com/learning/course/684/detail/11867
基于Fegin实现服务调用
内容介绍:
一、 优化 RestTemplate
二、 Fegin 实现负载均衡
一、优化 RestTemplate
Product product =
RestTemplate.getForobject(url:http://localhost:/product/” +pid, Product.class);
此代码是我们进行微服务商品调用的代码,目前我们使用的是 RestTemplate 完成的服务调用,但这种方式其实有一定问题。
第一个问题:现在我们的参数是通过 URI 拼接的,这种写法在代码可读性是不良好的;
第二个问题:在代码风格上也不一致,我们在调用本地的服务时直接使用的是 @Autowired 注入的 service,但在调用远程服务时却用的是 RestTemplate ,造成编程风格不统一。
接下来我们通过优化将这两个问题解决掉。我们需要加入一个新的组件 Feign 。
Feign 是 Spring Cloud 提供的一个声明式的伪 Http 客户端,它使得调用远程服务就像调用本地服务一样简单,只需要创建一个接口并添加一个注解即可。
Nacos 很好的兼容了Fegin ,Fegin 默认集成了Ribbon ,所以在Nacos下使用 Fegin 默认就实现了负载均衡的效果。
Fegin的使用
1、引入Fegin的依赖
2、在主类上添加 Fegin 的注解
3、创建一个 service ,并使 Fegin 实现服务调用。
4修改 controller 代码,并启动验证。
二、Fegin 实现负载均衡
1、引入依赖
第一步在 pom.xml 中引入 Fegin 的依赖,输入 回车 ,在 之后输入 openfegin 回车,版本不用写将其删掉并导入。
2、添加注解
第二步来到主类上添加一个注解叫 @EnableFeginClients //开启 fegin 的客户端。
3、修改代码
第三步打开 OrderController,不再使用Product product =
RestTemplate.getForobject(url:http://localhost:/product/” +pid, Product.class);
这个代码,而要将其改为
@Autowired
Private OrderService orderservice;
这种形式,此时我们需要提供一个 OrderService 的接口,下面进行创建:Product product =
RestTemplate.getForobject(url:http://localhost:/product/” +pid, Product.class);
下方的作用是根据一个 pid 查询商品,所以我们最好加入一个商品的服务接口。
new 一个ProductService 将其改成接口,我们需要操作的就是将Product product =
RestTemplate.getForobject(url:http://localhost:/product/” +pid, Product.class);
替换掉,放在 ProductService 内,它的主要作用就是发送一个 ur ,然后获取返回的类型。
Fegin 为我们提供了两个注解以实现此功能。
第一个为 @FeginClient ,我们可以在内指定 value 属性,它指定的就是 service-product ,将其输入并写上 //value 用于指定调用 nacos 下哪个微服务,这个值就是在 nacos 中的微服务名称。然后学习如何执行操作 /product/” +pid, 需要我们声明一个方法,在下方输入 public Product findByPid(Integer pid); 既然为接口,那么前方的 Product 可以省略。
接着在上方再加一个代码为 @RequestMapping 的注解,并将 /product/” +pid, 代入其中。
在 public ProductfindByPid(Integer pid);
中加入 PathVariable ,在上方输入 //指定请求的 URI部分。FeignClient 的 value + RequestMapping 的value 值其实就是完整的请求路径,也就是”http://service-product/product/” + pid .
到目前为止我们已经完成了 Fegin 的 Service 接口的编选,然后将上边的代码删掉。同调用本地接口相同,输入
@Autowired
Private ProductService productService;
然后就可以调用使用了,为了保留一个完整的代码,还是将其复制一份并将 ribbon 改为 fegin ,接着将
Product product =
RestTemplate.getForobject(url:http://service-product/” +pid, Product.class);
改为上边注入的 productService 即可,即:
Product product = productService .findByPid(pid);
到这里就把 fegin 改完了。
重新启动 OrderApplication 做一个测试,等待启动完毕进行一次访问,对网址进行刷新就可发现访问成功。