一.基础配置
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 #配置规则 最空闲连接策略