SpringCloud微服务之Eureka集成OpenFeign

x33g5p2x  于2021-09-24 转载在 Spring  
字(4.3k)|赞(0)|评价(0)|浏览(557)

版本说明

  • spring-cloud-starter-openfeign : 3.0.3
  • spring-cloud-starter-netflix-eureka-client :2.2.9.RELEASE
  • spring-cloud-starter-netflix-ribbon : 2.2.9.RELEASE
  • spring-boot-starter-parent :2.3.12.RELEASE
  • spring-cloud-dependencies :Hoxton.SR12
    这里需要注意SpringBoot 与 SpringCloud的版本匹配,请参考:
    https://spring.io/projects/spring-cloud

注册中心

请参考:https://blog.csdn.net/MadLifeBin/article/details/120332483
可搭建单机版用于 Demo 测试

创建微服务提供者

Maven配置

<dependency>
  <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</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-netflix-eureka-client</artifactId>
</dependency>

创建启动类,增加注解

这里暂时不需要数据库

@EnableEurekaClient
@EnableDiscoveryClient
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class HttpFeignProvider8083 {
    public static void main(String[] args) {
        SpringApplication.run(HttpFeignProvider8083.class, args);
    }
}

创建一个接口类型用于测试

这里很简单的两个URLMapping,简单模拟两个场景:

  1. 根据用户id查询用户名;
  2. 根据产品id查询产品名;
@RestController
public class HttpFeignProviderController {

    @GetMapping("/user/getUserNameById")
    public String getUserNameById(@RequestParam("userId") String userId){
        return "张学友";
    }

    @GetMapping("/product/getProductNameById")
    public String getProductNameById(@RequestParam("productId") String productId){
        return "iphone 13";
    }
}

配置文件

server.port=8083

spring.application.name=http-feign-provider8083

eureka.client.serviceUrl.defaultZone=http://host80:8080/eureka/,http://host81:8081/eureka/,http://host82:8082/eureka/
eureka.client.serviceUrl.healthcheck=true

# 若不配置该项,使用 spring.application.name 显示
#eureka.instance.instance-id=http-feign-provider8083

# actuator info 配置
info.app.name=${spring.application.name}
info.company.name=pengld

创建微服务消费者

Maven配置

这里增加了一个依赖:spring-cloud-starter-netflix-ribbon,用于服务调用时负载均衡,为必须依赖项。

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</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-netflix-eureka-client</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
    </dependencies>

创建启动类

同样暂时不需要数据库,比服务提供者多一个注解:@EnableFeignClients

@EnableEurekaClient
@EnableDiscoveryClient
@EnableFeignClients
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class HttpFeignConsumer8084 {
    public static void main(String[] args) {
        SpringApplication.run(HttpFeignConsumer8084.class, args);
    }
}

创建feign client

对比到前文服务提供者的controller,这里模拟两个场景,实际开发中根据功能、模块等维度划分不同的client用于区分。

UserClient

@FeignClient(name="http://http-feign-provider8083",contextId = "UserClient",path = "/user")
public interface UserClient {

    @GetMapping("/getUserNameById")
    String getUserNameById(@RequestParam("userId") String userId);

}

ProductClient

@FeignClient(name="http://http-feign-provider8083",contextId = "ProductClient",path = "/product")
public interface ProductClient {

    @GetMapping("/getProductNameById")
    String getProductNameById(@RequestParam("productId") String productId);

}

服务消费侧创建接口模拟远程调用

@RestController
public class ConsumerController {
    @Autowired
    UserClient userClient;
    @Autowired
    ProductClient productClient;

    @GetMapping("/getUserNameById")
    public String getUserNameById(@RequestParam("userId") String userId){
        return userClient.getUserNameById(userId);
    }

    @GetMapping("/getProductNameById")
    public String getProductNameById(@RequestParam("productId") String productId){
        return productClient.getProductNameById(productId);
    }
}

代码参考仓库:
https://gitee.com/pengld-demo/my-spring-cloud-demo

相关文章