改进子项目OrderService,将远程服务调用方式由RestTemplate改为Feign技术。
Feign是一个声明式的http客户端,其作用就是帮助我们优雅的实现http请求的发送。
1、pom添加Feign依赖:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
2、创建Feign客户端接口UserClient:
package cn.it32.order.clients;
import cn.it32.order.pojo.User;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
/**
* Created by on 2022/10/20.
*/
@FeignClient("userservice")
public interface UserClient {
@GetMapping("/user/{id}")
User findById(@PathVariable("id") Long id);
}
这个接口封装的是所有对userservice的远程调用,因此接口前加了一个注解@FeignClient,并且指明了服务名称是userservice。这是一个基于SpringMVC的注解来声明远程调用的信息,具体格式为:
- 服务名称:userservice
- 请求方式:Get
- 请求路径:/user/{id}
- 请求参数:Long id
- 返回值类型:User
后续要调用userservice时,就只需要拿这个接口,调这个方法即可。
3、创建Feign配置类DefaultFeignConfiguration:
package cn.it32.order.config;
import feign.Logger;
import org.springframework.context.annotation.Bean;
/**
* Created by on 2022/10/20.
*/
public class DefaultFeignConfiguration {
@Bean
public Logger.Level logLevel(){
return Logger.Level.BASIC;
}
}
4、SpringBoot启动类添加Feign注解(即开关),同时删除RestTemplate代码:
package cn.it32.order;
import cn.it32.order.config.DefaultFeignConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;
/**
* Created by DYB on 2022/10/20.
*/
@MapperScan("cn.it32.order.mapper")
@SpringBootApplication
@EnableFeignClients(defaultConfiguration = DefaultFeignConfiguration.class)
public class OrderApplication {
public static void main(String[] args) {
SpringApplication.run(OrderApplication.class, args);
}
}
5、修改业务处理逻辑类OrderService:
package cn.it32.order.service;
import cn.it32.order.clients.UserClient;
import cn.it32.order.mapper.OrderMapper;
import cn.it32.order.pojo.Order;
import cn.it32.order.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
* Created by on 2022/10/20.
*/
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Autowired
private UserClient userClient;
public Order queryOrderById(Long orderId) {
// 1.查询订单
Order order = orderMapper.findById(orderId);
// 2.用Feign远程调用
User user = userClient.findById(order.getUser_id());
// 3.封装user到Order
order.setUser(user);
// 4.返回
return order;
}
}
6、重新编译并运行OrderService:
再次执行,调用成功。
说明:相比传统的RestTemplate调用方式,Feign的特点主要是简洁,不需要去记住调用服务的url路径。