1、Spring Cloud实战前提
1.1、技术储备
语言基础——Spring Cloud是基于Java语言的工具套件,同时是基于Spring Boot构建的,所以要有Java+SpringBoot基础
1.2、工具及版本
jdk1.8 + springBoot1.4.3.RELEASE + SpringCloud Camden SR4 + Maven3.3.9
2、服务提供者与消费者
2.1、服务提供者(生产者)相关代码
2.1.1、pom文件如下:
<?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">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.3.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.gome</groupId>
<artifactId>provider-user</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>provider-user</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncodeing>UTF-8</project.build.sourceEncodeing>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<!-- 引入Spring Cloud依赖 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Camden.SR4</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>
2.1.2、其他部分与一般SpringBoot项目一样
@RestController("/user")
public class UserController {
@Autowired
private UserMapper userMapper;
@GetMapping("/{id}")
public User findById(@PathVariable Long id) {
User one = userMapper.getOne(id);
return one;
}
}
2.2、服务消费者代码
2.2.1、pom文件基本同上,修改<artifactId>相关项目名称即可
2.2.2、请求生产者服务的代码
2.2.3、代码优化
由于以上代码要请求的项目地址直接写在代码里,属于“硬编码”。我们可以通过配置文件进行优化,如下:
2.2.4、依然存在的问题
- 适用场景局限——如果服务提供者修改网络地址(IP或者端口),将会影响服务消费者。这事消费者要重新修改配置文件重新发布启动。这显然不可取!
- 无法动态伸缩——生产环境下,每个微服务一般都会部署多个实例,以实现容灾和负载均衡。这就需要系统有自动伸缩的能力,比如动态增减节点。硬编码无法满足这种需求!
3、补充知识——整合SpringBoot Actuator
Actuator可以对SpringBoot项目进行健康状况的检测
3.1、添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
3.2、常用端点描述
通过这些请求对应项目所在地址(IP+端口)拼接以上uri可以获取该项目目前的各项健康状况,如下:
请求 http://localhost:8000/health 响应以下内容:
{
"status" : "UP",
"diskSpace" : {
"status" : "UP",
"total" : 214750457856,
"free" : 183337144320,
"threshold" : 10485760
}
"db" : {
"status" : "UP",
"database" : "MYSQL",
"hello" : 1
}
}
其中UP表示运行正常。除了UP外,还有DOWN、OUT_OF_SERVICE、UN-KNOWN等状态