【SpringCloud+RabbitMQ+Docker+Redis+搜索+分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】
先看看我们之前写的代码

//2.1 URL路径
String url = "http://userservice/user/" + order.getUserId();
//2.2 发送HTTP请求,实现远程调用
User user = restTemplate.getForObject(url, User.class);
这样的方式通过指明要访问的服务名称和url 路径、调用时写明请求方式以及返回值类型
由restTemplate 对象bean 帮助我们向地址发起请求,最后把结果转成对应的实体类型
其实这段代码已经在Ribbon 的基础上做过优化了,但是它依然存在一些问题如下:
【总之:不够优雅】
Feign是一个声明式的http客户端,官方地址:https://github.com/OpenFeign/feign


【今天是2022年10月29日,四天前的提交,不错】
其作用就是帮助我们优雅的实现http请求的发送,解决上面提到的问题。
使用Feign 的步骤如下:
① 引入依赖
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
dependency>

② 在order-service的启动类添加注解开启Feign的功能:

③ 编写Feign 客户端

package cn.itcast.order.clients;
import cn.itcast.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* ClassName: UserClient
* date: 2022/10/29 13:12
*
* @author DingJiaxiong
*/
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
主要是基于SpringMVC的注解来声明远程调用的信息,比如:
修改业务层
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
//2. 用Feign远程调用
User user = userClient.findById(order.getUserId());
//3. 封装user 到Order
order.setUser(user);
// 4.返回
return order;
}
对比一下

嗯,很明显,代码清晰了
OK,启动服务测试【这里笔者把服务改回单点启动【8848】了,并且和老师的一样,修改了一下order 的启动端口为8088】

并且把命名空间配置取消了,现在的Nacos 控制台情况

就我们刚刚开始那样
OK测试

OK, 没问题,使用Feign 也可以实现远程调用
多请求两次
查看日志

可以看到也实现了负载均衡


8081 和 8082 是随机的,
OK,没毛病
Feign的使用步骤
①引入依赖
②添加@EnableFeignClients注解
③编写FeignClient接口
④使用FeignClient中定义的方法代替RestTemplate