本文章是基于jdk1.8.0_144,spring boot 2.0.2.release和spring cloud Finchley.RC1
项目源码下载地址:https://download.csdn.net/download/hongtao_scau/10437906
一、基础准备
spring cloud是依赖于spring boot,不熟悉Spring Boot的同学可以学习以下文章:两小时学会spring boot。
spring cloud的版本学习参考:spring cloud的版本
Spring Cloud并没有熟悉的数字版本号,而是对应一个开发代号。
Cloud代号 | Boot版本(train) | Boot版本(tested) | lifecycle |
---|---|---|---|
Angle | 1.2.x | incompatible with 1.3 | EOL in July 2017 |
Brixton | 1.3.x | 1.4.x | 2017-07卒 |
Camden | 1.4.x | 1.5.x | - |
Dalston | 1.5.x | not expected 2.x | - |
Edgware | 1.5.x | not expected 2.x | - |
Finchley | 2.x | not expected 1.5.x | - |
文章用到的 Finchley.RC1是当前的稳定全面的版本,开发者可以根据自己项目的需求选择对应的版本
二、项目创建(多模块项目)
使用Idea创建maven项目,不勾选Create from archetype,选择next,填写项目名称等配置
创建完成之后删除项目中的src文件夹。
三、创建spring cloud config server 服务端
1、创建cloudserver模块
new Module :选择Spring Initalizr ,选择next,
填写项目信息,Group、Artifact和刚刚第二步的填写一样,type选择maven Project
选择next后。下图界面,界面选择config server,为我们自动导入spring cloud的依赖。
最后生成项目文件 ,等待maven加载完毕。
2、以下是我完成cloudserver 所有配置之后的项目结构,接下来会一一讲解
第一步,先看看我们的依赖pom文件
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.hongtaofans</groupId>
<artifactId>cloudserver</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>cloudserver</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RC1</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-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
引入spring cloud,版本号为Finchley.RC1,要是不配置健康管理可以不引入actuator模块,要是不需要eureka注册中心则不需要引入这个模块,根据自己的需求引入这两个模块。不清楚dependency和dependencyManagement的区别可以在网上查看区别。
2、创建配置文件application
application.yml内容如下:
spring:
profiles:
active: native
native 表示读取本地文件,即会读取application-native文件,也可以配置成git来读取git文件
native 文件如下所示
server:
port: 8888
spring:
cloud:
config:
server:
native:
search-locations: classpath:/properties/
配置配置中心服务端口8888,配置文件的地址为本地的properties目录下,这是让client服务发现配置文件的地址配置
git文件如下所示
server:
port: 8888
spring:
application:
name: config-server
cloud:
config:
server:
git:
uri: https://github.com/hongtaofans/properties.git
username:123
password:123
配置git的地址,配置内容可以参考:
git配置中心
3、配置文件:
新建properties文件,在目录下建application-dev.properties、application-prod.properties、application-test.properties文件,分别表示开发环境,生产环境、测试环境的配置文件。
application-dev.properties内容如下,简单配置
url=192.168.35.46
server.port=8081
4、项目启动
CloudserverApplication内容如下:
@SpringBootApplication
@EnableConfigServer
public class CloudserverApplication {
public static void main(String[] args) {
SpringApplication.run(CloudserverApplication.class, args);
}
}
@enableConfigserver是配置项目为config中心,由此,启动项目,项目在8888端口启动,可以访问
四、client读取config server 服务
1、新建boot 模块,选择Spring initializr,勾选依赖项如下图:
2、博主最后的boot目录结构如下
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.hongtao</groupId>
<artifactId>boot</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>boot</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</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>
<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>Finchley.RC1</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>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
注意了,这里的spring cloud版本要保持一致,repository也要配置
2、新建bootstrap.properties(这里不能是yml文件,我踩过的坑)这里,需要配置在bootstrap中才能生效,而不是在application配置文件中,bootstrap配置文件会比application更加早的加载。
# 指明配置服务中心的网址
spring.cloud.config.uri=http://127.0.0.1:8888
spring.application.name=application
spring.cloud.config.profile=dev
spring.cloud.config.label=master
配置中心网址uri、name、profile,读取的文件会是配置中心的uri+name-profile的路径,即http://127.0.0.1:8888/application-dev。label主要是针对git中心的配置路径:/{label}/{application}-{profile}.properties,这里不详讲。
3、BootApplication启动文件
@SpringBootApplication
@RestController
public class BootApplication {
public static void main(String[] args) {
SpringApplication.run(BootApplication.class, args);
}
@Value("${url}")
private String datUrl;
@RequestMapping(value = "/hi")
public String hi(){
return datUrl;
}
}
通过@Value可以获取配置文件url的值
先启动cloudserver再启动boot项目
访问localhost:8081/hi 可以得到配合文件中的url,说明本地配置中心已经成功运行。
但是,我们可能不能局限于此,博主在文章的开端已经埋下伏笔,要把eureka注册中心也配置进来。
五、eureka配置
1、eureka的作用众所周知,一个注册中心的决策,对标dubbo。
新建eureka模块,选择如下,导入eureka配置
目录结构如下:
2、pom依赖,加入了eureka模块
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>cn.hongtao</groupId>
<artifactId>eurekaserver</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eurekaserver</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RC1</spring-cloud.version>
</properties>
<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-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</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>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project>
3、配置文件和启动文件
application文件,端口8761,service-url是注册地址,也就是localhost:8761/eureka/
server.port=8761
eureka.instance.hostname=localhost
###eureka.client.registerWithEureka:false和fetchRegistry:false来表明自己是一个eureka server
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
然后就是EurekaServerApplication,enableEurekaServer是配置她是一个eureka服务
@EnableEurekaServer
@SpringBootApplication
public class EurekaserverApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaserverApplication.class, args);
}
}
启动EurekaServerApplication,访问localhost:8761,如图发布成功,可是DSreplicas还没有内容。
4、改造cloudserver和boot项目(pom文件已经在之前引入依赖)
cloudserver:
application-native.yml加入eureka配置
server:
port: 8888
spring:
cloud:
config:
server:
native:
search-locations: classpath:/properties/
application:
name: config-server
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
配置注册名为config-server,并写入注册中心的地址。
启动文件CloudseverApplication中加入注解,配置注册项目
@EnableEurekaClient
同样,在boot项目中,配置bootstrap文件
加入配置
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/ spring.cloud.config.discovery.enabled=true spring.cloud.config.discovery.service-id=config-server
service-id是发现的服务id为config-server,也是就是我们的上一步填写的cloudsever,这样一来,boot就可以使用cloudsever的服务。
在启动项中同样加上注解
@EnableEurekaClient
由此我们一次启动eurekaServer、cloudserver、boot项目,访问localhost:8761可以看到以下,config-server和application已经被注册
由此,我们完成了整个项目的配置,谢谢大家学习,希望有什么问题请多多指教。