# SpringCloud(六)Config客户端配置与SpringCloud总结
# 1. Config:客户端连接服务端访问
* 可以写多个客户端,统一的放到github上,通过一个server去连接
* 实现配置与编码解耦
* 在springcloud-config项目中新建文件:**config-client.yml**,并推送到远端
```yml
spring:
profiles:
active: dev
---
server:
port: 8201
# spring配置
spring:
profiles: dev
application:
# 三个服务名称一致
name: springcloud-provider-dept
# Eureka的配置,服务注册到哪里
eureka:
client:
service-url:
# 服务发布地址
defaultZone: http://localhost:7001/eureka/
---
server:
port: 8202
# spring配置
spring:
profiles: test
application:
# 三个服务名称一致
name: springcloud-provider-dept
# Eureka的配置,服务注册到哪里
eureka:
client:
service-url:
# 服务发布地址
defaultZone: http://localhost:7001/eureka/
```
* 新建module:**springcloud-config-client-3355**
* 添加pom.xml依赖
```xml
<dependencies>
<!--clientConfig-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
<!--Web-->
<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-devtools</artifactId>
</dependency>
</dependencies>
```
* 创建**bootstrap.yml**
```yml
# 系统级别的配置
spring:
cloud:
config:
# 获取地址
uri: http://localhost:3344
# 需要从git上读取的资源名称,不要后缀
name: config-client
# 环境
profile: dev
# 分支
label: master
```
* 创建**application.yml**
```yml
# 用户级别的配置
spring:
application:
name: springcloud-config-client-3355
```
* 创建**ConfigClientController.java**
```java
@RestController
public class ConfigClientController {
@Value("${spring.application.name}")
private String applicationName;
@Value("${eureka.client.service-url.defaultZone}")
private String eurekaServer;
@Value("${server.port}")
private String port;
@RequestMapping("/config")
public String getConfig() {
return "applicationName:" + applicationName +
"eurekaServer:" + eurekaServer +
"port:" + port;
}
}
```
* 创建主启动类
```java
@SpringBootApplication
public class ConfigClient_3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClient_3355.class,args);
}
}
```
* 启动3344端口、3355module
* 访问地址:http://localhost:3344/master/config-client-dev.yml
* 得到下列数据
```text
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka/
server:
port: 8201
spring:
application:
name: springcloud-provider-dept
profiles:
active: dev
```
* 通过数据中可以看到3355module的配置
* 端口:8201
* 环境:dev
* 访问:http://localhost:8201/config
* 得到客户端配置信息
```text
applicationName:springcloud-provider-depteurekaServer:http://localhost:7001/eureka/port:8201
```
* 从而实现,客户端从服务端获取远程配置
* 在实际开发的过程中,各个模块中不用配置大量的内容,只需固定的配置模板,从根本上实现了编码和配置的解耦,即方便的开发人员,也方便了运维人员的维护。
# 2. Config:远程配置实战测试
* 在springcloud-config仓库中添加**config-eureka.yml**
```yml
spring:
profile:
active: dev
---
server:
port: 7001
# spring配置
spring:
profiles: dev
application:
# 三个服务名称一致
name: springcloud-config-eureka
# Eureka配置
eureka:
instance:
# 服务端的实例名称
hostname: localhost7001
client:
# 表示是否向eureka注册中心注册自己
register-with-eureka: false
# 如果为false,表示自己为注册中心
fetch-registry: false
# 监控页面
service-url:
# 单机:defaultZont: http://${eureka.instance.hostname}:${server.port}/eureka/
# 集群(关联):
defaultZone: http://localhost:7002/eureka/,http://localhost:7003/eureka/
---
server:
port: 7001
# spring配置
spring:
profiles: test
application:
# 三个服务名称一致
name: springcloud-config-eureka
# Eureka配置
eureka:
instance:
# 服务端的实例名称
hostname: localhost7001
client:
# 表示是否向eureka注册中心注册自己
register-with-eureka: false
# 如果为false,表示自己为注册中心
fetch-registry: false
# 监控页面
service-url:
# 单机:defaultZont: http://${eureka.instance.hostname}:${server.port}/eureka/
# 集群(关联):
defaultZone: http://localhost:7002/eureka/,http://localhost:7003/eureka/
```
* 在springcloud-config仓库中添加**config-dept.yml**
```yml
spring:
profiles:
active: dev
---
server:
port: 8001
# mybatis配置
mybatis:
type-aliases-package: com.example.springcloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
# spring配置
spring:
profiles: dev
application:
# 三个服务名称一致
name: springcloud-config-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
# Eureka的配置,服务注册到哪里
eureka:
client:
service-url:
# 服务发布地址
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
instance:
# 修改Eureka的默认描述信息
instance-id: springcloud-provider-dept8001
# 打开ip信息
prefer-ip-address: true
# info配置
info:
app.name: levnli-springcloud
company.name: www.levnli.cn
---
server:
port: 8001
# mybatis配置
mybatis:
type-aliases-package: com.example.springcloud.pojo
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath:mybatis/mapper/*.xml
# spring配置
spring:
profiles: test
application:
# 三个服务名称一致
name: springcloud-config-dept
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/db02?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: root
# Eureka的配置,服务注册到哪里
eureka:
client:
service-url:
# 服务发布地址
defaultZone: http://localhost:7001/eureka/,http://localhost:7002/eureka/,http://localhost:7003/eureka/
instance:
# 修改Eureka的默认描述信息
instance-id: springcloud-provider-dept8001
# 打开ip信息
prefer-ip-address: true
# info配置
info:
app.name: levnli-springcloud
company.name: www.levnli.cn
```
* 将仓库代码推送到远端
* 新建一个module:**springcloud-config-eureka-7001**
* 将**springcloud-eureka-7001**文件全部复制
* 在pom.xml添加依赖
* ```xml
<!--clientConfig-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
```
* 替换**application.yml**
* ```yml
spring:
application:
name: springcloud-config-eureka-7001
```
* 创建**bootstrap.yml**
* ```yml
spring:
cloud:
config:
name: config-eureka
label: master
profile: test
uri: http://localhost:3344
```
* 修改主启动类名:**EurekaServer_Config_7001**
* 新建一个module:**springcloud-config-dept-8001**
* 将**springcloud-provider-dept-8001**文件全部复制
* 在pom.xml添加依赖
* ```xml
<!--clientConfig-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
```
* 替换**application.yml**
* ```yml
spring:
application:
name: springcloud-config-dept-8001
```
* 创建**bootstrap.yml**
* ```yml
spring:
cloud:
config:
name: config-dept
label: master
profile: test
uri: http://localhost:3344
```
* 修改主启动类名:**DeptProvider_Config_8001**
* 启动3344端口
* 访问:http://localhost:3344/master/config-eureka-dev.yml
* 得到配置信息
* 访问:http://localhost:3344/master/config-dept-dev.yml
* 得到配置信息
* 启动Config_7001
* 访问:http://localhost:7001
* 正常显示注册中心页面
* 启动Config_8001
* 访问:http://localhost:8001/dept/get/1
```json
{
deptNo: 1,
deptName: "开发部",
dbSource: "db01"
}
```
# 3. SpringCloud总结与展望
* SpringCloud是依赖SpringBoot的
* SpringCloud有五大神兽
* Eureka:注册中心,可配置集群
* 对比ZooKeepr
* zookeeper分主节点,当主节点发生网络故障,从节点会选举,但是在选举的过程中有很大的可能发生故障
* C P原则:一致性、容错
* Eureka节点之间是平等关系,只有所有注册中心集群全部宕机下线,才会彻底无法使用。
* A P原则:可用性、容错
* 添加依赖
```xml
<!--eureka服务依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
```
* 开启服务
```java
@EnableEurekaServer
```
* application.yml配置
```yml
server:
port: 7001
# Eureka配置
eureka:
instance:
# 服务端的实例名称
hostname: eureka7001.com
client:
# 表示是否向eureka注册中心注册自己
register-with-eureka: false
# 如果为false,表示自己为注册中心
fetch-registry: false
# 监控页面
service-url:
# 单机:defaultZont: http://${eureka.instance.hostname}:${server.port}/eureka/
# 集群(关联):
defaultZone: http://localhost:7002/eureka/,http://localhost:7003/eureka/
```
* 启动访问:http://localhost:7001
* 查看注册中心
* 其他节点信息
* 已注册服务节点信息
* 自我保护机制
* 由于注册中心和服务节点之间是通过心跳检测服务是否还在线
* 默认30秒探测一下
* 默认90秒无响应认为死亡
* 确认服务死亡后,将移除该服务
* 当服务总数健康值低于15%时,认为服务集群出了故障,为了保证服务能运行,将不再移除服务节点,可能当时数据不是最新,但是服务还能正常使用。只有服务集群健康值恢复才会退出自我保护
* 默认开启,不建议关闭。
* 配置移除服务时间
* eureka注册中心
```yml
# Eureka配置
eureka:
server:
# 关闭自我保护机制
enable-self-preservation: false
# 移除失效服务时间: 毫秒
eviction-interval-timer-in-ms: 2000
```
* 服务提供者
```yml
# Eureka的配置,服务注册到哪里
eureka:
instance:
# 发送心跳间隔 1s
lease-renewal-interval-in-seconds: 1
# 2秒超时,认为死亡
lease-expiration-duration-in-seconds: 2
```
* 当该节点下线5秒,服务将会被移除
* 服务上线后会被重新注册
* Ribbon:基于客户端的负载均衡,通过RestTemplate,让客户端可以直接调用
* 添加依赖
```xml
<!--Ribbon-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
```
* 使用前需要创建配置对象,通过Bean注入
* 需要开启客户端负载均衡时,
```java
/**
* 配置负载均衡实现RestTemplate
* 添加@LoadBalanced
* 基于Ribbon
*/
@Bean
@LoadBalanced
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
```
* 调用方式
```text
(url, 实体:Map, Class<T> responseType)
```
* 可以处理的请求类型
* GET
* HEAD
* POST
* PUT
* PATCH
* DELETE
* OPTIONS
* Feign
* 是声明式的webservice客户端,让微服务之间调用变得更简单了,只需要创建一个接口,然后添加注解即可。
* pom.xml依赖
```xml
<!--Feign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
<version>1.4.6.RELEASE</version>
</dependency>
```
* Hystrix
* 熔断
* 降级
* dashboard流监控
* Zuul
* 路由
* 网关
SpringCloud(六)Config客户端配置与SpringCloud总结