Spring Cloud学习笔记【七】Config 配置中心与客户端的搭建使用与详解
springcloud的版本Hoxton.SR1,springboot的版本是2.2.2.RELEASE。
一、eruka服务端搭建
a.依赖引入
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-server'
b.添加注解
@SpringBootApplication
@EnableEurekaServer
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
c.配置文件配置
spring.application.name=eureka
#eureka默认端口
server.port=8761
#禁止自己当做服务去注册
eureka.client.register-with-eureka=false
#自我保护模式关闭
eureka.server.enable-self-preservation=false
# 清理无效节点的时间间隔(单位毫秒,默认是60*1000)
# 生产环境,不会频繁重启,所以,一定要把自我保护机制打开,否则网络一旦终端,就无法恢复。
eureka.server.eviction-interval-timer-in-ms=10000
二、配置中心搭建
2.1、git仓库准备
可以新建一个spring-cloud-config的仓库,并创建一个release的分支版本,便于测试!!!
使用 git作为配置存储,除了 git 外,还可以用数据库、svn、本地文件等作为存储。
2.2、编码实现
implementation 'org.springframework.cloud:spring-cloud-config-server'
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
添加注解@EnableConfigServer
@SpringBootApplication
@EnableEurekaClient
@EnableConfigServer
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
配置项目信息和git仓库信息
#服务端口
server.port=9008
#项目名称
spring.application.name=config-service
#往配置中心添加服务的地址
eureka.client.service-url.defaultZone:http://localhost:8761/eureka/
# git仓库地址(项目地址,直接复制链接但要去除.git就行)
spring.cloud.config.server.git.uri=http://192.168.3.6:3000/laihx/spring-cloud-config
# git仓库地址下的相对搜索地址(可用使用通配符),可以配置多个,用分割,可以{application}实现按应用查配置
spring.cloud.config.server.git.search-paths=config
# git仓库的账号(公开仓库无需账号信息)
spring.cloud.config.server.git.username=805292506@qq.com
# git仓库的密码(公开仓库无需账号信息)
spring.cloud.config.server.git.password=laihx123456
#git默认分支
spring.cloud.config.server.git.default-label=master
#日志配置(详细日志,便于观察)
logging.level.web=trace
4、配置webhooks,即为web钩子!git的pub_key一般在C:\Users\admin\.ssh的位置!
5、测试
Spring Cloud Config 有它的一套访问规则,我们在日志中就可以详细的看出访问规则,我们通过这套规则在浏览器上直接访问就可以。
{GET /{name}-{profiles}.properties}: properties(String,String,boolean)
{GET [/{name}-{profiles}.yml, /{name}-{profiles}.yaml]}: yaml(String,String,boolean)
{GET /{name}/{profiles:.*[^-].*}, produces [application/json]}: defaultLabel(String,String)
{GET [/{label}/{name}-{profiles}.yml, /{label}/{name}-{profiles}.yaml]}: labelledYaml(String,String,String,boolean)
{GET /{name}/{profiles}/{label:.*}, produces [application/json]}: labelled(String,String,String)
{GET /{name}-{profiles}.json}: jsonProperties(String,String,boolean)
{GET /{label}/{name}-{profiles}.json}: labelledJsonProperties(String,String,String,boolean)
{GET /{label}/{name}-{profiles}.properties}: labelledProperties(String,String,String,boolean)
{GET /{name}/{profiles:.*[^-].*}, produces [application/vnd.spring-cloud.config-server.v2+json]}: defaultLabelIncludeOrigin(String,String)
{GET /{name}/{profiles}/{label:.*}, produces [application/vnd.spring-cloud.config-server.v2+json]}: labelledIncludeOrigin(String,String,String)
{application} 就是应用名称,对应到配置文件上来,就是配置文件的名称部分,例如我上面创建的配置文件,在git创建的文件前缀。
{profile} 就是配置文件的版本,我们的项目有开发版本、测试环境版本、生产环境版本,对应到配置文件上来就是以 application-{profile}.yml 加以区分,例如application-dev.yml、application-sit.yml、application-prod.yml。
{label} 表示 git 分支,默认是 master 分支,如果项目是以分支做区分也是可以的,那就可以通过不同的 label 来控制访问不同的配置文件了。
a、根据这三条规则,我们可以通过以下地址查看配置文件内容:
http://localhost:9008/config/dev/master
http://localhost:9008/config-dev.yml
http://localhost:9008/master/config-dev.yml
b、改变查询分支
http://localhost:9008/release/config-dev.yml
为什么会多出红色的东西出来?
是因为config-dev.yml会自动合并config.yml里面的内容,如果相同,获取config-dev.yml的内容,如果有多出来的,会进行合并,这个对于不同环境的相同配置就非常的又好了,只需要统一去配置相同项就行了!
改变获取文件的格式也是可以的
http://localhost:9008/master/config-dev.json
http://localhost:9008/master/config-dev.properties
6、文件保存路径
从日志里面可以看出来,config-service会自动拉起文件进行下载到默认文件下!但在生成环境的中,这样是非常的不安全的,需要保存到指定的有权限操作的文件夹才行!
#文件拉取的保存路径
spring.cloud.config.server.git.basedir=E:/basedir
三、客户端搭建
a.依赖引入
plugins {
id 'org.springframework.boot' version '2.2.2.RELEASE'
id 'io.spring.dependency-management' version '1.0.8.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
ext {
set('springCloudVersion', "Hoxton.SR1")
}
dependencies {
implementation "com.alibaba:fastjson:1.2.55"
implementation"mysql:mysql-connector-java:5.1.32"
implementation"org.springframework.boot:spring-boot-starter-data-jpa"
implementation 'org.springframework.cloud:spring-cloud-config-client'
implementation'org.springframework.cloud:spring-cloud-starter-openfeign'
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.cloud:spring-cloud-starter-netflix-eureka-client'
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
test {
useJUnitPlatform()
}
b.配置文件配置,application.yml
spring:
application:
name: client
datasource:
password: root
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/order?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false
username: root
jpa:
show-sql: true
hibernate:
ddl-auto: update
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
platform:
order:
code:
profile: p_123456
suffix: qqqqqq
project:
branch: master
env: dev
c.编码
@Entity
public class OrderInfo implements Serializable {
/**
* 订单ID,自增
*/
@Id
@GeneratedValue
private Long orderId;
/**
* 订单Code
*/
private String orderCode;
/**
* 用户ID
*/
private Long userId;
/**
* 用户名称
*/
private String userName;
/**
* 订单价格
*/
private BigDecimal orderPrice;
/**
* 创建时间
*/
@JSONField(format = "yyyy-MM-dd")
private Date createTime;
public Long getOrderId() {
return orderId;
}
public void setOrderId(Long orderId) {
this.orderId = orderId;
}
public String getOrderCode() {
return orderCode;
}
public void setOrderCode(String orderCode) {
this.orderCode = orderCode;
}
public Long getUserId() {
return userId;
}
public void setUserId(Long userId) {
this.userId = userId;
}
public BigDecimal getOrderPrice() {
return orderPrice;
}
public void setOrderPrice(BigDecimal orderPrice) {
this.orderPrice = orderPrice;
}
public Date getCreateTime() {
return createTime;
}
public void setCreateTime(Date createTime) {
this.createTime = createTime;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
@Repository
public interface OrderInfoRepository extends JpaRepository<OrderInfo,Long> {
}
@Service
public class OrderInfoServiceImpl implements OrderInfoService {
@Autowired
private OrderInfoRepository orderInfoRepository;
@Override
public OrderInfo query(OrderInfo order) throws Exception {
return orderInfoRepository.getOne(order.getOrderId());
}
@Override
public List<OrderInfo> list() throws Exception {
return orderInfoRepository.findAll();
}
}
@Component
@RefreshScope
public class OrderCodeConfig implements Serializable {
@Value("${platform.order.code.profile}")
private String profile;
@Value("${platform.order.code.suffix}")
private String suffix;
public String getProfile() {
return profile;
}
public void setProfile(String profile) {
this.profile = profile;
}
public String getSuffix() {
return suffix;
}
public void setSuffix(String suffix) {
this.suffix = suffix;
}
}
@RestController
@RequestMapping("/order")
public class OrderInfoController {
@Autowired
private OrderCodeConfig orderCodeConfig;
@Autowired
private OrderInfoService orderInfoService;
/**
* @todo 查询订单列表
* @return
* @throws Exception
*/
@RequestMapping(value = "/list",method = RequestMethod.GET)
public String list() throws Exception {
List<OrderInfo> list = orderInfoService.list();
return JSON.toJSONString(list);
}
/**
* @todo 查询订单配置
* @return
* @throws Exception
*/
@RequestMapping(value = "/config",method = RequestMethod.GET)
public String config() throws Exception {
return JSON.toJSONString(orderCodeConfig);
}
}
d.测试
可以正确注册到eruka服务上
可以正确的访问数据库,并获取数据
也就是说目前client端,能够正确的注册到eruka服务器上,并且能够正确的访问数据库,接下来进行改造!!
e.新建bootstrap.yml配置文件
配置文件中:application.yml是用户级的资源配置项,bootstrap.yml是系统级的,优先级更加高,会更先加载!!!
spring:
cloud:
config:
discovery:
enabled: true
service-id: CONFIG-SERVER #config-service配置中心的application的name
profile: dev #获取具体的什么环境 {profile}
name: config #获取git创建的配置文件的前缀{application}
label: master #分支选择
application:
name: client
g.测试http://localhost:8080/order/config
进行修改git的文件,看配置是否修改成功!!!这个时候肯定是要重启config-service,和config-client的!!!
重启之后访问
至此,Config 配置中心与客户端的搭建完成!