翻阅所写文章,搭建一套完整的微服务
系列貌似少了配置中心 - Config,因此本篇来补充一下,这里做一整合!所有项目为重新创建,并非之前三篇文章所用项目。
环境
<properties>
<java.version>1.8</java.version>
<spring-boot.version>2.1.6.RELEASE</spring-boot.version>
<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
</properties>
编码:Intellij IDEA ;
其他:默认本地已安装 Git, Maven, Redis, RabbitMQ;
项目创建:使用 IDEA 提供的 Spring Initializr 快速创建项目。
1 注册中心-Eureka Server
Eureka Server
充当的是 注册中心
的角色,其他服务都会注册到注册中心,记录着所有服务的信息以及状态。作为负载均衡器,提供服务的故障切换。
1.1 创建项目
创建一个简单的 eureka
项目。
- 步骤:Create NewProject / Spring Initializr.
-
填写 groupId 以及 artifactId.
-
选择 Eureka Server 组件.
初始依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
1.2 配置
- 配置文件 -
application.yml
.
spring:
application:
name: eureka
server:
port: 8761
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka/
- 启动类 -
EurekaApplication.java
.
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
1.3 启动查看
访问 http://localhost:8761 查看.
2 服务注册-Eureka Client
Eureka Client
充当的角色是 服务注册
,通过简单的配置自动注册到注册中心,一般就是指系统中的其他服务。默认情况下,Eureka使用客户端心跳来确定服务是否已启动。
2.1 创建项目
创建一个最简单的 client
服务,创建方法跟eureka
服务类似,组件选择
Spring Cloud Discovery/Eureka Discovery Client
-
Web/Spring Web Starter
即可!
初始依赖:
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</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>
2.2 配置
- 配置文件 -
application.yml
.
spring:
application:
name: client
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka/
- 启动类 -
ClientApplication.java
.
@SpringBootApplication
@EnableDiscoveryClient
public class ClientApplication {
public static void main(String[] args) {
SpringApplication.run(ClientApplication.class, args);
}
}
2.3 启动查看
注意
: 如果服务直接启动不起来,请检查是否已加入 Web/Spring Web Starter
依赖.
启动完毕,访问 http://localhost:8761/ ,检查 Client
服务是否已注册到注册中心 Eureka
.
3 Eureka Server HA
实现 Eureka 的高可用也比较简单,一句话概括就是:服务间两两注册。如下图所示
3.1 Eureka Server改造
搭配 IDEA 更方便!
- Eureka Server-01 配置文件 application.yml.
spring:
application:
name: eureka
server:
port: 8761
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/
# 默认每个 eureka server 也是 eureka client,使用下面配置即避免自己注册自己
registerWithEureka: false
启动项目!
- Eureka Server-02 配置文件 application.yml.
spring:
application:
name: eureka
server:
port: 8762
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8763/eureka/
# 默认每个 eureka server 也是 eureka client,使用下面配置即避免自己注册自己
registerWithEureka: false
启动项目!
- Eureka Server-03 配置文件 application.yml.
spring:
application:
name: eureka
server:
port: 8763
eureka:
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/
# 默认每个 eureka server 也是 eureka client,使用下面配置即避免自己注册自己
registerWithEureka: false
启动项目!
3.2 Eureka Client 改造
- Eureka Client 配置文件 application.yml.
spring:
application:
name: client
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/
启动项目!
- 检验 Eureka Server 的高可用.
分别访问 http://localhost:8761/ 、 http://localhost:8762/ 、 http://localhost:8763/
然后模拟故障,手动 DOWN 掉任意一个服务,访问剩余服务,发现 Eureka Client 依旧注册在剩余服务上,这也就实现了 Eureka Server 的高可用。
4 路由网关 - Zuul
网关
充当的角色就是 所有请求的统一入口
,客户端的所有请求都会通过它分发到相应的服务,这么说来,网关的重要性也不言而喻,稳定、高可用、性能、并发、安全以及扩展性都成了服务网关的必备要素。Zuul 的核心是一系列的过滤器,比如 PRE(前置)、POST(后置)、Route(路由)以及错误(Error)。
4.1 创建项目
创建一个最简单的 gateway
服务,创建方法跟eureka
服务类似,组件选择
Spring Cloud Discovery/Eureka Discovery Client
-
Spring Cloud Routing/Zuul
即可。
4.2 添加验证接口
为体现网关的作用,我们先需要在 Eureka Client
服务编写一个接口来验证网关的可用性。
package com.bpm.client.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@GetMapping("/getMessage")
public String getMessage() {
return "hello, I am client.";
}
}
重新启动 Eureka Client
服务!
4.3 配置
- 配置文件 -
application.yml
.
spring:
application:
name: gateway
server:
port: 8080
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/
zuul:
routes:
# client 即 Eureka Client 服务的 spring.application.name
# /myClient/** 即 Eureka Client 服务的所有接口可通过这种方式访问
client: /myClient/**
# 既然我们已将 Eureka Client 服务接口的请求方式改变了,
# 那就不希望可以通过下面这种方式还可以访问到,这也是 Zuul 的默认访问方式,
# 所以使用如下配置可以禁用该种方式的访问,如有其他服务,配置方式类似
ignored-patterns:
- /client/**
# - /client-2/**
- 启动类 -
GatewayApplication.java
.
@SpringBootApplication
@EnableZuulProxy
public class GatewayApplication {
public static void main(String[] args) {
SpringApplication.run(GatewayApplication.class, args);
}
}
4.4 启动查看
-
访问原服务 Eureka Client 接口:http://127.0.0.1:8081/getMessage 检验接口是否能正常返回;
-
访问网关服务 gateway 路由接口:http://127.0.0.1:8080/myClient/getMessage 检验接口是否能正常返回;
-
访问网关服务 gateway 路由接口:http://127.0.0.1:8080/client/getMessage 检验接口是否能正常返回;
通过以上结果,符合我们的预期!
5 配置中心 - Config Server
5.1 创建项目
创建一个最简单的 config
服务,创建方法跟eureka
服务类似,组件选择
Spring Cloud Discovery/Eureka Discovery Client
-
Spring Cloud Config/Config Server
即可。
5.2 配置
- 添加其他依赖,完整依赖如下.
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- spring cloud bus -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
</dependencies>
- Github 创建项目.
首先需要在 Github, Gitlab, Gitea, Gitee, Gogs, or Bitbucket 创建一个项目,比如我在 Github 创建了一个项目config-repo
,然后在这个项目中添加一个配置文件client-dev.yml
,内容如下:
env: dev
该如何使用我们在 5.3 Client 项目改造
说明,接着完成下面的步骤!
- Config Server 配置文件 - application.yml.
spring:
application:
name: config
cloud:
config:
server:
git:
uri: https://github.com/bearpotman/config-repo
username: yourGitUsername
password: yourGitPassword
basedir: C:/workSpace/IdeaProjects/spring-cloud-demo/configFiles
server:
port: 9090
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka/
# 以下配置适用于前期调试配置刷新功能,如果配置了自动刷新则不需要该配置
# 手动刷新接口地址 http://localhost:9090/actuator/bus-refresh
# 官方文档地址 https://cloud.spring.io/spring-cloud-static/Greenwich.SR1/single/spring-cloud.html#_bus_refresh_endpoint
management:
endpoints:
web:
exposure:
include: bus-refresh
- 启动类 - ConfigApplication.java.
@SpringBootApplication
@EnableDiscoveryClient
@EnableConfigServer
public class ConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ConfigApplication.class, args);
}
}
启动项目!
5.3 Client 项目改造
- 添加依赖 - pom.xml.
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>
- 配置文件(首先将配置文件名由 application 改为 bootstrap) - bootstrap.yml.
说明
:改名的目的是先去拉取远程配置,再加载本地配置。
spring:
application:
name: client
cloud:
config:
discovery:
enabled: true
service-id: CONFIG
profile: dev
server:
port: 8081
eureka:
client:
service-url:
defaultZone: http://127.0.0.1:8761/eureka/,http://127.0.0.1:8762/eureka/,http://127.0.0.1:8763/eureka/
- 添加测试接口来调试配置刷新功能.
package com.bpm.client.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RefreshScope
public class ConfigController {
@Value("${env}")
public String env;
@GetMapping("/env")
public String getEnv() {
return env;
}
}
启动项目!
启动后控制台可以看到如下输出并且没有报错信息就说明配置基本正确,如有报错,根据报错信息查找具体原因,这里就不再详述!
...
Fetching config from server at : http://DESKTOP-P524IS1:9090/
...
- 调试配置刷新功能.
- 首先请求上述接口 http://127.0.0.1:8080/myClient/env,如果输出
dev
,则说明可以拉取远程的配置; - 修改 Github 上的
client-dev.yml
文件,将 dev 修改为 prod; - 通过 Postman 或其他方式发送
POST
请求 http://127.0.0.1:9090/actuator/bus-refresh ; - 观察
Config Sever
项目控制台和Eureka Client
项目控制台,正在输出更新配置的一些日志; - 重新请求接口 http://127.0.0.1:8080/myClient/env,如果输出
prod
,则说明可以动态刷新配置;
- 关于自动刷新配置.
说明
:该功能我本地调试一直没有刷新,还在尝试中。大概说一下步骤,以下步骤可能有欠缺之处
- Config Server添加依赖.
<!-- 支持 webhook /monitor 自动刷新依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-monitor</artifactId>
</dependency>
- Github 项目 config-repo 配置 Webhook.
本地调试可以使用内网穿透工具(网上有很多,选择一个使用即可,比如 ngrok),映射本地端口(即配置中心服务 Config Server 所使用端口)9090
;
Github 项目 config-repo 添加 Webhook 请求地址,比如我本地映射后,最终要添加到 Webhook 的接口地址为:http://xxizgi.natappfree.cc/monitor
,注意 Content-Type 要选择 application/json;
- 更改
client-dev.yml
文件.
将prod
更改为test
,请求接口 http://127.0.0.1:8080/myClient/env 查看配置是否更新。
补充 :
我在 Github 修改了 client-dev.yml
配置文件的内容, Webhook 看似是起作用了,但是配置还是没有刷新,因为我也配置了 basedir,但是那个目录下的配置文件内容并没有更新;
然而当我使用 Postman 发送请求 http://xxizgi.natappfree.cc/monitor
时,配置是可以刷新的,所以这里我就比较懵了。。。还在努力分析中😭
倘若各位路过的大神可以指点一二,小弟不胜感激!