spring cloud 整合 consul+openfeign

目标

最近发现公司在一些新项目中用到了Spring cloud 相关技术栈,而恰好我对这一块不是很熟,所以打算自己搭建一下环境来熟悉一下springcloud开发体系。

Spring Cloud 和 Spring Boot版本选择

由于spring cloud 是以一系列 组件的集合,并且都基于springBoot,所以我们搭建 spring cloud体系时,需要注意 两件事情

  • 注意springBoot的版本和spring Cloud版本匹配

    访问 https://start.spring.io/actuator/info 可以查询最近的 一些spring cloud 所推荐的 spring boot版本

    "spring-cloud": {
    			"Hoxton.SR11": "Spring Boot >=2.2.0.RELEASE and <2.3.999.BUILD-SNAPSHOT",
    			"Hoxton.BUILD-SNAPSHOT": "Spring Boot >=2.3.999.BUILD-SNAPSHOT and <2.4.0.M1",
    			"2020.0.0-M3": "Spring Boot >=2.4.0.M1 and <=2.4.0.M1",
    			"2020.0.0-M4": "Spring Boot >=2.4.0.M2 and <=2.4.0-M3",
    			"2020.0.0": "Spring Boot >=2.4.0.M4 and <=2.4.0",
    			"2020.0.3": "Spring Boot >=2.4.1 and <2.5.3-SNAPSHOT",
    			"2020.0.4-SNAPSHOT": "Spring Boot >=2.5.3-SNAPSHOT"
    		},
    
  • 主要spring Cloud组件也要和spring cloud的版本匹配

    同时 spring Cloud的版本信息 也可以在 https://docs.spring.io/spring-cloud/docs/中看到

    下面时 Hoxton.SR6 所推荐的 spring cloud 组件的版本

    Legal	
    Legal information.
    
    Documentation Overview	
    About the Documentation, Getting Help, First Steps, and more.
    
    spring-cloud-aws	
    spring-cloud-aws Reference Documentation, version 2.2.2.RELEASE
    
    spring-cloud-build	
    spring-cloud-build Reference Documentation, version 2.3.1.BUILD-SNAPSHOT
    
    spring-cloud-bus	
    spring-cloud-bus Reference Documentation, version 2.2.2.RELEASE
    
    spring-cloud-circuitbreaker	
    spring-cloud-circuitbreaker Reference Documentation, version 1.0.3.RELEASE
    
    spring-cloud-cli	
    spring-cloud-cli Reference Documentation, version 2.2.1.RELEASE
    
    spring-cloud-cloudfoundry	
    spring-cloud-cloudfoundry Reference Documentation, version 2.2.2.RELEASE
    
    spring-cloud-commons	
    spring-cloud-commons Reference Documentation, version 2.2.3.RELEASE
    
    spring-cloud-config	
    spring-cloud-config Reference Documentation, version 2.2.3.RELEASE
    
    spring-cloud-consul	
    spring-cloud-consul Reference Documentation, version 2.2.3.RELEASE
    
    spring-cloud-contract	
    spring-cloud-contract Reference Documentation, version 2.2.3.RELEASE
    
    spring-cloud-function	
    spring-cloud-function Reference Documentation, version 3.0.8.RELEASE
    
    spring-cloud-gateway	
    spring-cloud-gateway Reference Documentation, version 2.2.3.RELEASE
    
    spring-cloud-gcp	
    spring-cloud-gcp Reference Documentation, version 1.2.3.RELEASE
    
    spring-cloud-kubernetes	
    spring-cloud-kubernetes Reference Documentation, version 1.1.3.RELEASE
    
    spring-cloud-netflix	
    spring-cloud-netflix Reference Documentation, version 2.2.3.RELEASE
    
    spring-cloud-openfeign	
    spring-cloud-openfeign Reference Documentation, version 2.2.3.RELEASE
    
    spring-cloud-security	
    spring-cloud-security Reference Documentation, version 2.2.2.RELEASE
    
    spring-cloud-sleuth	
    spring-cloud-sleuth Reference Documentation, version 2.2.3.RELEASE
    
    spring-cloud-task	
    spring-cloud-task Reference Documentation, version 2.2.3.RELEASE
    
    spring-cloud-vault	
    spring-cloud-vault Reference Documentation, version 2.2.3.RELEASE
    
    spring-cloud-zookeeper	
    spring-cloud-zookeeper Reference Documentation, version 2.2.2.RELEASE
    

实战

配置 Consul

先进入下载 https://www.consul.io/downloads

然后 用开发模式启动

consul agent -dev

访问 http://localhost:8500/

创建my-consul-feign父工程

创建pom.xml,

springCloud版本选择 Hoxton.SR1

所以 springBoot 版本选择 2.2.2.RELEASE

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
    <lombok.version>1.16.18</lombok.version>
    <spring.boot.version>2.2.2.RELEASE</spring.boot.version>
    <spring.cloud.version>Hoxton.SR1</spring.cloud.version>
</properties>
<dependencyManagement>
    <dependencies>
        <!--springboot 2.2.2-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring.boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <!--Spring cloud Hoxton.SR1-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring.cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
    </dependencies>
</dependencyManagement>

创建my-consul-server 服务提供者

pom.xml
<?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>
        <artifactId>my-consul-feign</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>my-consul-server</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>my-consul-server</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <!--SpringCloud consul-server-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</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-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

配置consul 相关

主启动类 配置 @EnableDiscoveryClient 能够让注册中心能够发现,扫描到该服务

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class MyConsulServerApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyConsulServerApplication.class, args);
    }

}
application.properties配置
server.port=8006
spring.application.name=my-consul-server
#consul注册中心地址和端口
spring.cloud.consul.host=localhost 
spring.cloud.consul.port=8500
#consul 注册服务名
spring.cloud.consul.discovery.service-name=${spring.application.name}
测试类
@Controller
public class HelloController{
    @GetMapping("/sayHello")
    @ResponseBody
    public String sayHello() {
        System.out.println("hello");
        return "hello";
    }
}
启动

可以看到服务注册到 consul中了,而且 服务名就是 我们指定的my-consul-server
在这里插入图片描述

可能遇到的问题

consul 报 All service checks failing
在这里插入图片描述

这个是由于 spring-boot-starter-actuator 没有被引入,actuator是用来做服务的健康检查的

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

集成openfeign

创建my-feign-api 项目

这里只指引入 spring-cloud-starter-openfeign,这个项目只是用来规定 api的

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>my-consul-feign</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
    <groupId>org.example</groupId>
    <artifactId>my-feign-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>my-feign-api</name>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
</project>
创建api接口
@FeignClient("my-consul-server")
@Component
public interface HelloApi {
    @GetMapping("/sayHello")
    String sayHello();
}

@FeignClient(“my-consul-server”) 用于指定 调用哪个服务名,我们这里指定 my-consul-server

@Component 指明 这个 需要注册到 spring容器中

改造 my-consul-server
pom.xml

将api模块进行引入

<dependency>
    <groupId>org.example</groupId>
    <artifactId>my-feign-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
</dependency>

controller

将 controller实现 helloApi, 注意这里返回值 要返回json ,否则 feign 调用时 无法正确转化回 返回值

@Controller
public class HelloController implements  HelloApi{

    @Override
    @ResponseBody
    public String sayHello() {
        System.out.println("hello");
        return "hello";
    }
}
创建my-consul-consumer项目

pom.xml

注意这里要引入 my-feign-api ,它同时会将 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>
        <artifactId>my-consul-feign</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>my-consul-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>my-consul-consumer</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
        <spring-cloud.version>2020.0.3</spring-cloud.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-consul-discovery</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-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>my-feign-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
    </dependencies>

</project>

配置启动类

@EnableFeignClients(basePackages = “com.example.api”) 用于指定 feign 接口 所在的包,用于将feign接口加载到 spring容器中

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients(basePackages = "com.example.api")
public class MyConsulComsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyConsulComsumerApplication.class, args);
    }

}
配置 测试接口

通过 @resource 将 helloApi注入到consumer中

@Controller
public class ConsumerController {

    @Resource
    private HelloApi helloApi;
    @GetMapping("/consumer/sayHello")
    @ResponseBody
    public String sayMyName(){
        System.out.println("123");
        String s = helloApi.sayHello();
        return s;
    }

}
properties配置
server.port=8081
spring.application.name=my-consul-consumer
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
spring.cloud.consul.discovery.hostname=127.0.0.1
spring.cloud.consul.discovery.service-name=${spring.application.name}
测试

启动server和 consumer 两个服务

在这里插入图片描述

测试consumer接口

在这里插入图片描述

看到接口返回成功代表 consul + feign 集成成功

项目地址

https://gitee.com/LylYorick/my-consul-feign

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值