spring boot 2.x spring cloud Greenwich.SR1 负载均衡openfeign搭建使用
文章目录
本次例子是基于上一次构建的
badger-spring-cloud-api
项目的基础上,使用的;
《springboot 2.x–spring cloud Greenwich.SR1 服务注册与发现–eureka搭建以及集群搭建》
《docker 、docker-compose环境部署eureka集群》
《spring boot 2.x spring cloud Greenwich.SR1 负载均衡ribbon搭建使用》
《spring boot 2.x spring cloud Greenwich.SR1 负载均衡ribbon自动装配,负载均衡部分源码解析》
具体代码信息,可以查看《码云》
1、项目搭建badger-spring-cloud-openfeign
的服务消费者
1.1、maven的pom文件如下,eureka的基础注册中心,然后就是spring-cloud-starter-openfeign
的自动装配包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.badger</groupId>
<artifactId>badger-spring-cloud-openfeign</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>badger-spring-cloud-openfeign</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
1.2、yaml的配置文件
server:
port: 7200
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
instance-id: ${spring.cloud.client.ip-address}:${server.port}
prefer-ip-address: true
spring:
application:
name: badger-spring-cloud-openfeign
1.3、springboot的主启动类
/**
* @EnableEurekaClient 开启eureka的客户端
* @EnableFeignClients 开启feign的客户端
* @author liqi
*/
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
public class OpenfeignApplication {
public static void main(String[] args) throws Exception {
SpringApplication.run(OpenfeignApplication.class, args);
}
}
需要注意,主类要加@EnableFeignClients
注解,启动声明式的feign
1.4、feign的声明式接口
/**
* feign接口
* 注解:@FeignClient 标注为feign接口 value 指向调用的模块名
* spring boot 2.0 只有一个服务端(value = "同一个名字"),只能写一个注解,
* 可以使用contextId 作为区分,而写多个@FeignClient
* @author liqi ,
*/
@FeignClient(value = "BADGER-SPRING-CLOUD-API")
public interface DemoFeignApi {
@GetMapping("/demo")
String demo();
}
@FeignClient
:
value
属性,指向的是,服务的提供者badger-spring-cloud-api在注册中心的注册的名称;原理跟ribbon一样,都是通过名称是去找请求列表,然后调用对应的服务;
contextId
属性:在springboot2.0之后,一个服务端(value = “同一个名字”),@FeignClient只能写一次,不然就会报错,而contextId
属性,可以理解成区分业务;
例如:声明了两个FeignClient的接口,都是调用同一组微服务(value = “BADGER-SPRING-CLOUD-API”),在springboot1.x,整合的时候,正常启动;而在2.x版本之后,就会报错,需要使用contextId
属性区分
@FeignClient(value = "BADGER-SPRING-CLOUD-API")
public interface DemoFeignApi {
@GetMapping("/demo")
String demo();
}
@FeignClient(value = "BADGER-SPRING-CLOUD-API")
public interface DemoSaveFeignApi {
@GetMapping("/save")
void save();
}
接口部分里的请求路径和请求参数,返回类型,对应的也是badger-spring-cloud-api
项目里的controller
@RestController
public class DemoController {
@Value("${server.port}")
String port;
@Value("${spring.cloud.client.ip-address}")
String address;
@GetMapping("/demo")
public String demo() {
return "我的地址是-->" + address + ":" + port;
}
}
请求方式(@PostMapping,@GetMapping,@PutMapping 等),请求参数(@RequestParam,@PathVariable,@RequestBody,各自对应就可以了;返回类型,可以对应,也可以直接使用String接收;springmvc中,返回的对象,也会默认使用json序列化成字符串,传输。下面有个例子
@FeignClient(value = "BADGER-SPRING-CLOUD-API")
public interface DemoApi {
@GetMapping(value = "/users")
List<User> list();
@GetMapping(value = "/user/{id}")
User selectByid(@PathVariable("id") Integer id);
@DeleteMapping(value = "/user/{id}")
void del(@PathVariable("id") Integer id);
@PutMapping(value = "/user/{id}")
void updateByid(@PathVariable("id") Integer id, @RequestBody User user);
@PostMapping("user")
void save(@RequestBody User user);
}
1.5、业务的controller
@RestController
public class DemoController {
@Autowired
DemoFeignApi api;
@GetMapping("/feign/demo")
public String demo() {
return api.demo();
}
}
2、项目启动,测试使用
启动步骤如下:
- 启动eureka的服务,端口8761;
- 修改yaml的配置文件,启动端口为7000,启动服务的提供者badger-spring-cloud-api;
- 修改yaml的配置文件,启动端口为7001,启动服务的提供者badger-spring-cloud-api;
- 启动服务的消费者badger-spring-cloud-openfeign,端口为7200;
这里为了测试负载均衡,我们使用不同的端口(7000,7001)启动了两份badger-spring-cloud-api应用;
调用openfeign的服务 http://localhost:7200/feign/demo;
持续调用,会发现业务上的端口,有顺序的改变;这个也是轮询的负载均衡算法生效了;以及远程调用badger-spring-cloud-api成功了。
我的地址是-->172.16.2.54:7000
我的地址是-->172.16.2.54:7001
3、负责均衡算法切换
由于openfeign是基于ribbon的,负责均衡算法切换上,参考
《spring boot 2.x spring cloud Greenwich.SR1 负载均衡ribbon搭建使用》;
《spring boot 2.x spring cloud Greenwich.SR1 负载均衡ribbon自动装配,负载均衡部分源码解析》;
具体代码信息,可以查看《[码云》](