目标
最近发现公司在一些新项目中用到了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