• Feign实现各个服务之间的远程调用问题


    Spring Cloud体系中,远程HTTP调用的常用实现方式有RestTemplateFeign等。Feign与RestTemplate相比,拥有更好的代码可读性、可维护性,舍弃了部分的灵活性,但是仍能满足绝大多数的需求。

    Feign集成Ribbon,feign声明式的web service客户端,让微服务调用变简单,提供负载均衡, feign是一个声明式的HTTP客户端,他的目的就是让远程调用更加简单。给远程服务发的是HTTP请求。简单来说就是调用不同服务的接口,获取数据,因为在传统项目中是不能跨服务获取数据的。

    Spring Cloud体系中,远程HTTP调用的常用实现方式有RestTemplateFeign等。FeignRestTemplate相比,拥有更好的代码可读性、可维护性,舍弃了部分的灵活性,但是仍能满足绝大多数的需求,引入依赖,添加@EnableFeignClients注解,接下来编写FeignClient接口,在@FeignClient注解中,必须要指定name属性,且Feign内部集成了Ribbon,当name名称为注册的微服务名称时,Feign会调用Ribbon配置的负载均衡规则选择一个微服务实例,并将选中实例的URL拼接至方法前,请求相应的微服务地址。Feign也可以脱离Ribbon使用,在@FeignClient注解中指定url属性,Feign就会使用指定的URL来拼装请求地址。Feign支持代码方式和属性方式两种配置。均支持局部或全局的配置。

    Feign的继承,Feign可以通过抽象公共接口,让服务端和客户端分别继承来实现代码重用。但是官方不推荐这么做,因为会导致微服间的紧密耦合。实际项目中可以根据情况灵活使用,此处就不展开讨论,详情可以点击此处了解。

    Feign性能优化

    Feign默认情况下是使用DefaultClient,集成Ribbon的时候使用的是LoadBalancerFeignClient,底层也是DefaultClient,只是加入了负载均衡规则。而DefaultClient底层是使用的HttpURLConnection来进行请求,是没有连接池支持的。

    具体流程:

    使用Feign实现远程HTTP调用
    首先引入依赖

    1.     org.springframework.cloud
    2.     spring-cloud-starter-openfeign


    然后在SpringBoot启动类上添加@EnableFeignClients注解

    1. @SpringBootApplication
    2. @EnableFeignClients
    3. public class ContentCenterApplication {
    4.     public static void main(String[] args) {
    5.         SpringApplication.run(ContentCenterApplication.class, args);
    6.     }
    7. }


    接下来编写FeignClient接口

    1. @FeignClient(name = "user-center")
    2. public interface UserCenterFeignClient {
    3.     @GetMapping("/users/{id}")
    4.     UserDTO findById(@PathVariable Integer id);
    5. }


    在@FeignClient注解中,必须要指定name属性,且Feign内部集成了Ribbon,当name名称为注册的微服务名称时,Feign会调用Ribbon配置的负载均衡规则选择一个微服务实例,并将选中实例的URL拼接至方法前,请求相应的微服务地址。

    Feign也可以脱离Ribbon使用,在@FeignClient注解中指定url属性,Feign就会使用指定的URL来拼装请求地址。

    1. @FeignClient(name = "test" , url = "www.baidu.com")
    2. public interface UserCenterFeignClient {
    3.     @GetMapping("")
    4.     String test();
    5. }
    6. //现在,就可以使用Feign来进行HTTP调用
    7. @Slf4j
    8. @Service
    9. @RequiredArgsConstructor(onConstructor = @__(@Autowired))
    10. public class ShareServiceImpl implements IShareService {
    11.     private final @NonNull UserCenterFeignClient userCenterFeignClient;
    12.     private final @NonNull ShareMapper shareMapper;
    13.  
    14.     @Override
    15.     public ShareDTO findShareById(Integer id) {
    16.         Share share = shareMapper.selectByPrimaryKey(id);
    17.         UserDTO userDTO = userCenterFeignClient.findById(share.getUserId());
    18.         ShareDTO shareDTO = ShareDTO.builder().build();
    19.         BeanUtils.copyProperties(share, shareDTO);
    20.         shareDTO.setWxNickname(userDTO.getWxNickname());
    21.         return shareDTO;
    22.     }
    23. }

  • 相关阅读:
    MySQL事务和索引
    论文精读:SimGNN: A Neural Network Approachto Fast Graph Similarity Computation
    protobuf 存取数据
    软件外包开发文档
    分割研究~~总结
    Ubuntu20.04 安装 NVIDIA 显卡驱动
    AndroidX App Startup 介绍及使用
    信奥中的数学:阶乘
    手写数字识别Mnist数据集和读取代码分享
    《向量数据库指南》——AI原生向量数据库Milvus Cloud 2.3稳定性
  • 原文地址:https://blog.csdn.net/a154555/article/details/126941821