spring boot 2.x spring cloud Greenwich.SR1 负载均衡openfeign搭建使用

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、项目启动,测试使用

启动步骤如下:

  1. 启动eureka的服务,端口8761;
  2. 修改yaml的配置文件,启动端口为7000,启动服务的提供者badger-spring-cloud-api;
  3. 修改yaml的配置文件,启动端口为7001,启动服务的提供者badger-spring-cloud-api;
  4. 启动服务的消费者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自动装配,负载均衡部分源码解析》

具体代码信息,可以查看《[码云》](

原创文章 83 获赞 155 访问量 36万+

猜你喜欢

转载自blog.csdn.net/qq_28410283/article/details/102721520