(三)微服务:OpenFeign/Feign (OpenFeign->Eureka->微服务)

Feign是Netflix开源的轻量级REST客户端,用于简化HTTP客户端的开发。结合Spring Cloud和Ribbon,Feign能够实现微服务之间的负载均衡调用,提供更便捷的远程服务调用方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是Feign?

Feign是Netflix公司开源的轻量级rest客户端,使用Feign可以非常方便的实现Http 客户端。Spring Cloud引入Feign并且集成了Ribbon实现客户端负载均衡调用(FeignrestTemplate都是一种客户端远程调用工具,但Feign结合了Ribbon实现了负载均衡)


前面我们实现微服务调用的是结合restTemplate远程调用和Ribbon客户端负载均衡,

	@Autowired
    RestTemplate restTemplate;

    /**
     * 测试客户端负载均衡ribbon
     */
    @Test
    public void test05() {
        //服务ID
        String serviceId = "XC-SERVICE-MANAGE-CMS";
        //ribbon从eureka获取服务列表
        for(int i=0; i<10; i++){
            ResponseEntity<Map> map = restTemplate.getForEntity("http://" + serviceId + "/cms/page/get/5a754adf6abb500ad05688d9", Map.class);
            Map body = map.getBody();
            System.out.println(body);
        }
    }

但这样编写代码不利于管理统一与多次调用。
我们需要将这些调用方法写在一个接口上,方便调用方随时随地的调用。

因此我们采用Feign结合Ribbon来取代掉之前的调用方式

1、引入依赖

<!--        feign:集成okhttp客户端远程调用和Ribbon客户端父子均衡,使微服务之间调用更便捷-->
     !--这个包包含了spring-cloud-starter-ribbon-->
     <dependency><
         <groupId>org.springframework.cloud</groupId>
         <artifactId>spring-cloud-starter-openfeign</artifactId>
     </dependency>
     <dependency>
         <groupId>com.netflix.feign</groupId>
         <artifactId>feign-okhttp</artifactId>
     </dependency>

2、启动类添加 @EnableFeignClients 开启Feign服务

3、调用服务方法接口配置(注意,是接口哦)

package com.xuecheng.manage_course.client;

/**
 * @author Huang
 * @version 1.0
 * @date 2020/4/15 13:35
 */

import com.xuecheng.framework.domain.cms.CmsPage;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

//指定调用的服务名(即被调用微服务的spring.appliaction.name,作为注册中心的域名)
@FeignClient(value = "XC-SERVICE-MANAGE-CMS")
public interface CmsPageClient {
    
    //根据页面ID查询页面信息,远程调用cms微服务请求数据
    @GetMapping("/cms/page/get/{id}") //表示远程调用http的方法类型(如:restTemplate.getForEntity()、restTemplate.postForEntity()等等)
    //如何知道远程调用http的方法类型和该方法的返回值类型呢?通过SwaggerUI查询对应微服务的接口即可获取该方法的详情信息
    public CmsPage findCmsPageById(@PathVariable("id") String id);
}

1)、@FeignClient:指定调用服务的域名

2)、通过查询接口文档工具(Swagger)来查看该方法的http请求方式和该方法的返回值类型
http请求方式:get、post、delete、put

4、yml

server:
  port: 80 #端口号(网页的端口一般默认80,避免用户额外添加端口访问)

spring:
  application:
    name: cloud-consumer-feign-order80 #服务名(作为注册中心的微服务名)

CLOUD-PAYMENT-SERVICE: #设置OpenFeign中Ribbon负载均衡策略("CLOUD-PAYMENT-SERVICE"是服务名)
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

ribbon: #设置OpenFeign客户端调用远程接口超时配置(OpenFeign默认支持Ribbon)
  ReadTimeout:  5000 #处理请求的超时时间
  ConnectTimeout: 5000 #连接建立的超时时长
  MaxAutoRetries: 1               #同一台实例的最大重试次数,但是不包括首次调用,默认为1次
  MaxAutoRetriesNextServer: 0     #重试负载均衡其他实例的最大重试次数,不包括首次调用,默认为0次
  OkToRetryOnAllOperations: false #是否对所有操作都重试,默认false

5、测试

    @Autowired
    CmsPageClient cmsPageClient;

    /**
     * 测试Feign
     */
    @Test
    public void test06() {
        //发起远程调用
        CmsPage cmsPage = cmsPageClient.findCmsPageById("5a754adf6abb500ad05688d9");
        System.out.println(cmsPage);
    }

只需要像接口调用方法那样即可(和DAO有雷同之处)

注意!远程调用的返回值一定要有无参构造方法,否则返回失败!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值