SpringCloud-Eureka之配置中心配置
一、什么是配置中心
随着线上项目变的日益庞大,每个项目都散落着各种配置文件,如果采用分布式的开发模式,
需要的配置文件随着服务增加而不断增多。某一个基础服务信息变更,都会引起一系列的更新和重启,
运维苦不堪言也容易出错,配置中心便是解决此类问题的灵丹妙药。
二、Spring Cloud Config
Spring Cloud Config项目是一个解决分布式系统的配置管理方案。它包含了Client和Server两个部分,
server提供配置文件的存储、以接口的形式将配置文件的内容提供出去,client通过接口获取数据、并依据此数据初始化自己的应用。
Spring cloud使用git或svn存放配置文件,默认情况下使用git,我们先以git为例做一套示例
三、构建项目
构建多模块的Maven项目
springcloud0502 主模块 quickstart项目
eureka-server-cluster 子模块 springboot项目
eureka-cluster1/eureka-cluster1(2个注册中心集群)
eureka-provider 子模块 springboot项目
生产者集群(provider1/provider2),同时此生产者也访问了配置中心里面的配置信息
eureka-consumer 子模块 springboot项目
Feign访问生产集群,Feign默认集成了Ribbon,默认实现了负载均衡的效果。
config-server 子模块 springcloud的配置中心
config-server1/config-server1(2个配置中心集群)
配置config-server的POM依赖
通过start.spring.io创建,dependencies要选择Config Server,会有两个选项,要先其中带有git/svn的
网址如需下:
https://start.spring.io/
点击下载,打开pom 复制到server-config子模块中
<?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>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.zking</groupId>
<artifactId>server-config</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>server-config</name>
<description>配置中心</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</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>
依赖添加完毕后,接下来就是我们的github仓库了
四、准备GitHub仓库
从仓库获取yml配置文件
在GitHub仓库中新建一个仓库,一个私库
将文件夹上传到私库中
三个文件内容为:
其他两个分别为:
config:
hello: hello Im prod private
config:
hello: hello Im test private
上传到私库后,在你的github添加你的公钥,我们用SSH协议进行读取
生成公钥,这里有坑,用的新版本命令生成是不行的,要用老版本
请先删除C:\Users\Administrator.ssh目录,重新生成ssh key
ssh-keygen -m PEM -t rsa -b 4096
新版本的命令生成:id_rsa的第一行“BEGIN OPENSSH PRIVATE KEY”
老版本的命令生成:id_rsa的第一行“BEGIN RSA PRIVATE KEY”
将自己的公钥(id_rsa.pub)添加到GitHub中
五、配置application.yml
---
server:
port: 8001
spring:
profiles: serverconfig1
application:
name: config-server
cloud:
config:
server:
git:
## 私库,ssh,需要ssh private-key
uri: 你自己的私库地址,注意使用ssh协议
search-paths: config-repo
label: master
ignore-local-ssh-settings: true
# | 不能省略 不要手贱
private-key: |
你自己的私钥
# 服务注册与发现相关配置
eureka:
client:
# 注册中心地址
serviceUrl:
defaultZone: http://peer1:7101/eureka/,http://peer2:7102/eureka/
---
server:
port: 8002
spring:
profiles: serverconfig2
application:
name: config-server
cloud:
config:
server:
git:
## 私库,ssh,需要ssh private-key
uri: 你自己的仓库地址,注意是ssh协议
search-paths: config-repo
label: master
ignore-local-ssh-settings: true
private-key: |
你自己的私钥
# 服务注册与发现相关配置
eureka:
client:
# 注册中心地址
serviceUrl:
defaultZone: http://peer1:7101/eureka/,http://peer2:7102/eureka/
在启动类中配置注解
@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient
public class ServerConfigApplication {
public static void main(String[] args) {
SpringApplication.run(ServerConfigApplication.class, args);
}
}
给端口配置启动项
分别给两个端口配置启动项
自动测试一下
5.测试
http://localhost:8001/spring-cloud-config-dev.yml
http://localhost:8001/spring-cloud-config-test.yml
http://localhost:8001/spring-cloud-config-prod.yml
能看到已经能访问到github仓库中的配置文件信息了
server搞起来之后,最终还是要在业务项目中去获取server端的配置信息
接下来就是配置config-client
六、配置client端
创建及编辑子模块config-client,它其实就是一个普通springboot项目,只不过添加了spring-cloud-config-client依赖,可以访问springcloud配置中心里面的配置信息.
config-client可以是生产者可以为消费者还可以为其他。。。
下面配置消费者eureka-provider作为config-client
config-client -> config-server -> github
1.配置pom
注1:通过start.spring.io创建,dependencies要选择Config Client
注2:入了两个坑:
坑一:网上大部分帖子导入依赖均为:“spring-cloud-config-client”,新版中其实是“spring-cloud-starter-config”, 最后还是通过start.spring.io查找生成pom,对比后才发现问题
坑二:start.spring.io生成的依赖中少了spring-boot-starter-web,tomcat无法启动
添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
注3:此模块不要引入spring-cloud-config-server依赖
添加一个yml文件bootstrap.yml
spring:
cloud:
config:
name: spring-cloud-config #对应spring-cloud-config-dev.yml的{spring-cloud-config}部分
profile: dev #对应spring-cloud-config-dev.yml的{dev}部分
## remove 下面代码已注释,因为不再通过URL直接访问配置中心,而是生产者->注册中心->配置中心->获得Git中的配置信息
#spring.cloud.config.uri = http://localhost:8001/ #配置中心的具体地址()
label: master #对应git的分支。如果配置中心使用的是本地存储,则该参数无用
## add
discovery:
enabled: true #true是从配置中心读取文件
service-id: config-server #指定配置中心的service-id,便于扩展为高可用配置集群(目前已启用)
# 服务注册与发现相关配置
eureka:
client:
# 注册中心地址
serviceUrl:
defaultZone: http://peer1:7101/eureka/,http://peer2:7102/eureka/
配置application.yml
---
# 配置端口
server:
port: 7201
# 服务名称
spring:
profiles: provider1
application:
name: eureka-provider
# 服务注册与发现相关配置
eureka:
client:
# 注册中心地址
serviceUrl:
defaultZone: http://peer1:7101/eureka/,http://peer2:7102/eureka/
---
# \u7AEF\u53E3\u53F7
server:
port: 7202
# \u670D\u52A1\u540D\u79F0
spring:
profiles: provider2
application:
name: eureka-provider
# \u670D\u52A1\u6CE8\u518C\u4E0E\u53D1\u73B0\u76F8\u5173\u914D\u7F6E
eureka:
client:
# \u6CE8\u518C\u4E2D\u5FC3\u5730\u5740
serviceUrl:
defaultZone: http://peer1:7101/eureka/,http://peer2:7102/eureka/
添加controller层代码
package com.zking.eurekaprovider.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Value("${server.port}")
private Integer port;
@Value("${config.hello}")
private String msg;
@RequestMapping("/hello")
public String hello(){
return "您好,我是生产者["+port+"]"+"配置内容"+msg;
}
}
config-client配置完毕
使用我们消费者去调用此方法
七、消费者代码
feign层
package com.zking.eurekaconsumer.service;
import com.zking.eurekaconsumer.service.impl.HelloFeignServiceFallBack;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestMapping;
@Service
@FeignClient(value = "eureka-provider")
public interface HelloFeignService {
@RequestMapping("/hello")
public String hello();
}
controller层
package com.zking.eurekaconsumer.controller;
import com.zking.eurekaconsumer.service.HelloFeignService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
@Autowired
private HelloFeignService helloFeignService;
@RequestMapping("/test")
public String test(){
return helloFeignService.hello();
}
}
大致结构
HelloFeignServiceFallBack是熔断器不用管他不需要添加,请忽略
消费者配置完毕
启动服务
调用我们的消费者的端口
测试一下看看
测试结果
我们的消费者调用了我们的生产者拿到了github中的配置文件
总结
config-server配置中心 是往 eureka-server注册中心进行注册
而我们的config-client也是往eureka-server进行注册
用过注册中心流程可为:
eureka-consumer -->eureka-provider–>config-server–>GitHub