如何在Spring Cloud 中使用Feign

本文介绍了一个基于Feign的微服务架构实现案例,包括基础配置、参数绑定及Ribbon配置等内容,详细展示了如何通过Spring Cloud生态组件搭建高效稳定的微服务集群。

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

一.基础配置

1.引入依赖,基于consul

<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid-spring-boot-starter</artifactId>
			<version>1.1.14</version>
		</dependency>

		<!-- 添加Web应用程序的典型依赖项 -->
		<dependency>
			<groupId> org.springframework.boot </groupId>
			<artifactId> spring-boot-starter-web </artifactId>
		</dependency>

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.3.2</version>
		</dependency>
		
		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-config</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency> 
<dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-openfeign</artifactId>
 </dependency>

2.创建主类

通过 @EnableFeginClients 注解开启 Feign 功能

@EnableDiscoveryClient
@EnableAutoConfiguration
@SpringBootApplication
@EnableFeignClients(basePackages = { "com.zhouzy.order.service" })
@EnableTransactionManagement
class WebApplication{
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }

}

3.定义AService接口

通过 @FeignClient 注解指定服务名来绑定服务, 然后使用SpringMVC 的注解来绑定具体该服务提供的 REST 接口

    @Resource
	ApiService apiService;
    
    /**
     * 更新
     * @author zhouzhiyao
     * @date 2021/07/17
     **/
     @RequestMapping("/updateAcount")
     public void updateAccount(Account account){
    	 apiService.update(account);
     }

二.参数绑定

package com.zhouzy.order.service;

import org.dromara.hmily.annotation.Hmily;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;

import com.zhouzy.order.model.Account;


@FeignClient(value="account",fallback = FeignApiFallBack.class)
public interface ApiService {
	   @PostMapping("/account/update")
	   @Hmily
	   public String update(Account account); 
}
package com.zhouzy.order.service;

import org.springframework.stereotype.Component;

import com.zhouzy.order.model.Account;

@Component
public class FeignApiFallBack implements ApiService{

	@Override
	public String update(Account account) {
		// TODO Auto-generated method stub
		return null;
	}

}
package com.zhouzy.account.controller;

import java.util.Map;

import javax.annotation.Resource;

import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.zhouzy.account.model.Account;
import com.zhouzy.account.service.AccountService;

/**
 * @description account
 * @author zhouzhiyao
 * @date 2021-07-17
 */
@RestController
@RequestMapping(value = "/account")
public class AccountController {

    @Resource
    private AccountService accountService;

    /**
    * 新增
    * @author zhouzhiyao
    * @date 2021/07/17
    **/
    @RequestMapping("/insert")
    public void insert(Account account){
        accountService.insert(account);
    }

    /**
    * 刪除
    * @author zhouzhiyao
    * @date 2021/07/17
    **/
    @RequestMapping("/delete")
    public void delete(int id){
        accountService.delete(id);
    }

    /**
    * 更新
    * @author zhouzhiyao
    * @date 2021/07/17
    **/
    @RequestMapping("/update")
    public void update(@RequestBody Account account){
        accountService.update(account);
    }

    /**
    * 查询 根据主键 id 查询
    * @author zhouzhiyao
    * @date 2021/07/17
    **/
    @RequestMapping("/load")
    public Object load(int id){
        return accountService.load(id);
    }

    /**
    * 查询 分页查询
    * @author zhouzhiyao
    * @date 2021/07/17
    **/
    @RequestMapping("/pageList")
    public Map<String, Object> pageList(@RequestParam(required = false, defaultValue = "0") int offset,
                                        @RequestParam(required = false, defaultValue = "10") int pagesize) {
        return accountService.pageList(offset, pagesize);
    }

}

 

三.Ribbon 配置

由于 Feign 的客户端负载均衡是通过 Ribbon 实现的, 所以可以通过配置 Ribbon 客户端的方式来自定义各个服务客户端调用的参数.

1.全局配置

全局配置直接使用 ribbon.<key>=<value>的方式来设置 ribbon 的各项默认参数. 比如, 修改默认的客户端调用超时时间:  

ribbon.ReadTimeout=5000
ribbon.ConnectTimeout=500

2.指定服务配置

大多数情况下, 服务调用的超时时间会根据实际服务的特性做一些调整, 所以需要指定服务配置

指定服务配置根据 <client>.ribbon.key=value 的格式进行配置

aservice.ribbon.ReadTimeout=2000
aservice.ribbon.ConnectTimeout=500

3.重试机制

ribbon.MaxAutoRetries=1
ribbon.MaxAutoRetriesNextServer=2

MaxAutoRetries 设置为1, 所以重试策略先尝试访问首选实例一次,失败后才会更换实例访问,而更换实例访问的次数通过 MaxAutoRetriesNextServer 参数设置为2, 所以会尝试更换两次实例进行重试.

在使用@FeignClient注解的时候 是默认使用了ribbon进行客户端的负载均衡的,默认的是随机的策略,那么如果我们想要更改策略的话,需要修改消费者yml中的配置,如下:

ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.ZoneAvoidanceRule
package com.zhouzy.account;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.context.annotation.Bean;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.netflix.loadbalancer.IRule;
import com.netflix.loadbalancer.ZoneAvoidanceRule;

@EnableDiscoveryClient
@EnableAutoConfiguration
@SpringBootApplication
@EnableTransactionManagement
class WebApplication{
    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
    @Bean
    public IRule feignRule() {
        return new ZoneAvoidanceRule();
    }

}

这里我们可以看到ribbon的策略主要有以下几种:

 com.netflix.loadbalancer.RandomRule #配置规则 随机
    com.netflix.loadbalancer.RoundRobinRule #配置规则 轮询
    com.netflix.loadbalancer.RetryRule #配置规则 重试
    com.netflix.loadbalancer.WeightedResponseTimeRule #配置规则 响应时间权重
    com.netflix.loadbalancer.BestAvailableRule #配置规则 最空闲连接策略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wwwzhouzy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值