SpringCloud(六)Config客户端配置与SpringCloud总结
SpringCloud(六)Config客户端配置与SpringCloud总结
1. Config:客户端连接服务端访问
-
可以写多个客户端,统一的放到github上,通过一个server去连接
-
实现配置与编码解耦
-
在springcloud-config项目中新建文件:config-client.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依赖
<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
# 系统级别的配置
spring:
cloud:
config:
# 获取地址
uri: http://localhost:3344
# 需要从git上读取的资源名称,不要后缀
name: config-client
# 环境
profile: dev
# 分支
label: master
- 创建application.yml
# 用户级别的配置
spring:
application:
name: springcloud-config-client-3355
- 创建ConfigClientController.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;
}
}
- 创建主启动类
@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
- 得到下列数据
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
- 得到客户端配置信息
applicationName:springcloud-provider-depteurekaServer:http://localhost:7001/eureka/port:8201
- 从而实现,客户端从服务端获取远程配置
- 在实际开发的过程中,各个模块中不用配置大量的内容,只需固定的配置模板,从根本上实现了编码和配置的解耦,即方便的开发人员,也方便了运维人员的维护。
2. Config:远程配置实战测试
- 在springcloud-config仓库中添加config-eureka.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
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添加依赖
-
<!--clientConfig--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>2.1.1.RELEASE</version> </dependency>
-
-
替换application.yml
-
spring: application: name: springcloud-config-eureka-7001
-
-
创建bootstrap.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添加依赖
-
<!--clientConfig--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>2.1.1.RELEASE</version> </dependency>
-
-
替换application.yml
-
spring: application: name: springcloud-config-dept-8001
-
-
创建bootstrap.yml
-
spring: cloud: config: name: config-dept label: master profile: test uri: http://localhost:3344
-
-
修改主启动类名:DeptProvider_Config_8001
-
-
启动3344端口
-
启动Config_7001
- 访问:http://localhost:7001
- 正常显示注册中心页面
- 访问:http://localhost:7001
-
启动Config_8001
-
访问:http://localhost:8001/dept/get/1
{ deptNo: 1, deptName: "开发部", dbSource: "db01" }
-
3. SpringCloud总结与展望
-
SpringCloud是依赖SpringBoot的
-
SpringCloud有五大神兽
-
Eureka:注册中心,可配置集群
-
对比ZooKeepr
- zookeeper分主节点,当主节点发生网络故障,从节点会选举,但是在选举的过程中有很大的可能发生故障
- C P原则:一致性、容错
- Eureka节点之间是平等关系,只有所有注册中心集群全部宕机下线,才会彻底无法使用。
- A P原则:可用性、容错
- zookeeper分主节点,当主节点发生网络故障,从节点会选举,但是在选举的过程中有很大的可能发生故障
-
添加依赖
<!--eureka服务依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.4.6.RELEASE</version> </dependency>
-
开启服务
@EnableEurekaServer
-
application.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/
-
- 查看注册中心
- 其他节点信息
- 已注册服务节点信息
-
自我保护机制
- 由于注册中心和服务节点之间是通过心跳检测服务是否还在线
- 默认30秒探测一下
- 默认90秒无响应认为死亡
- 确认服务死亡后,将移除该服务
- 当服务总数健康值低于15%时,认为服务集群出了故障,为了保证服务能运行,将不再移除服务节点,可能当时数据不是最新,但是服务还能正常使用。只有服务集群健康值恢复才会退出自我保护
- 默认开启,不建议关闭。
- 由于注册中心和服务节点之间是通过心跳检测服务是否还在线
-
配置移除服务时间
-
eureka注册中心
# Eureka配置 eureka: server: # 关闭自我保护机制 enable-self-preservation: false # 移除失效服务时间: 毫秒 eviction-interval-timer-in-ms: 2000
-
服务提供者
# Eureka的配置,服务注册到哪里 eureka: instance: # 发送心跳间隔 1s lease-renewal-interval-in-seconds: 1 # 2秒超时,认为死亡 lease-expiration-duration-in-seconds: 2
-
当该节点下线5秒,服务将会被移除
-
服务上线后会被重新注册
-
-
-
Ribbon:基于客户端的负载均衡,通过RestTemplate,让客户端可以直接调用
-
添加依赖
<!--Ribbon--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> <version>1.4.6.RELEASE</version> </dependency>
-
-
使用前需要创建配置对象,通过Bean注入
-
需要开启客户端负载均衡时,
/** * 配置负载均衡实现RestTemplate * 添加@LoadBalanced * 基于Ribbon */ @Bean @LoadBalanced public RestTemplate getRestTemplate() { return new RestTemplate(); }
-
-
调用方式
(url, 实体:Map, Class<T> responseType)
-
可以处理的请求类型
- GET
- HEAD
- POST
- PUT
- PATCH
- DELETE
- OPTIONS
-
Feign
-
是声明式的webservice客户端,让微服务之间调用变得更简单了,只需要创建一个接口,然后添加注解即可。
-
pom.xml依赖
<!--Feign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.6.RELEASE</version> </dependency>
-
-
Hystrix
- 熔断
- 降级
- dashboard流监控
-
Zuul
- 路由
- 网关
-
- 感谢你赐予我前进的力量