1.SpringCloud Config分布式配置
什么是SpringCloud Config分布式配置中心
比如现在有多个服务A、B、C三个服务,那么他就会有三个配置文件,那如果我们可以把这三个配置文件放在同一个配置中心中,这样效果就会比较的好,然后我们就从这个配置服务中心去找,这样的话就比较的方便;
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务的应用的所有环节提供了一个中心化的外部配置。
Spring Cloud Config分为服务端和客户端两部分;
服务端称为分布式配置中心,他是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密,解密信息等访问接口。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用git来存储配置信息,这样就有利于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。
SpringCloud config分布式配置中心能干嘛
- 集中管理配置文件
- 不同环境、不同配置、动态化的配置更新,分环境部署,比如/dev /test /prod /beta /release
- 运行期间冬天调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息。
- 当配置发生变动时,服务不需要重启,即可感知到配置的变化,并应用新的配置。
- 将配置信息一REST接口的形式暴露
SpringCloud config分布式配置中心与github整合
由于Spring Cloud Config默认使用Git来存储配置文件(也有其他的方式,比如支持SVN和本地文件),但是最推荐的还是Git,而且使用的是http、https访问的形式;
2.通过Git连接本地项目
-
在Gitee上创建application.yml配置文件
spring: profiles: active: dev --- spring: profiles: dev #测试环境 application: name: springcloud-config-dev --- spring: profiles: test #开发环境 application: name: springcloud-config-test
-
创建项目:springcloud-config-service-3344
-
引入项目依赖(jar包)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> <version>2.0.0.RELEASE</version> </dependency> <!--actuator完善监控信息--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
-
创建Application.yml配置相关配置
server: port: 3344 spring: application: name: springcould-config #连接远程仓库 cloud: config: server: git: uri: https://gitee.com/you-smile-so-sweet/springcould-config.git
-
开启相关配置
package com.ddf.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer; @SpringBootApplication @EnableConfigServer //开启配置服务 public class Config_Service_3344 { public static void main(String[] args) { SpringApplication.run(Config_Service_3344.class, args); } }
如果报以下错误:
说明application.yml配置的文件有误:就是因为去掉了—
3.通过本地项目连接远程仓库的客户端
-
在Gitee上创建config-client配置文件,连接eureka
spring: profiles: active: dev --- server: port: 8201 #spring的配置 spring: profiles: dev application: name: springcould-config #eureka的配置 eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka/ --- server: port: 8202 #spring的配置 spring: profiles: test application: name: springcould-config #eureka的配置 eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka/
-
创建项目springcloud-config-service-3355
-
引入项目依赖(jar包)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>2.1.1.RELEASE</version> </dependency> <!--actuator完善监控信息--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--web--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
-
创建Application.yml和bootstrap.yml配置相关配置
Application.yml(用户级别的配置):
#用户级别的配置 spring: application: name: springcloud-config-client-3355
bootstrap.yml(系统级别的配置):
#系统级别的配置 spring: cloud: config: uri: http://localhost:3344 name: config-client #需要从git上读取的资源名称,不要后缀 label: master profile: dev
-
创建Controller层,把我们连接的配置信息显示出来:ConfigClientController
配置的信息对应gitee远程项目文件上的信息
package com.ddf.springcloud.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 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 "application:" + applicationName + "eurekaServer:" + eurekaServer + "port:" + port; } }
-
配置启动类测试
package com.ddf.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Config_server_3355 { public static void main(String[] args) { SpringApplication.run(Config_server_3355.class, args); } }
-
先启动3344项目在启动3355项目,然后访问:http://localhost:8201/config,就可以获取到信息了
4.在远程仓库部署Eureka7001
-
在Gitee上创建config-eureka配置文件,部署eureka
spring: profiles: active: dev --- server: port: 7001 spring: profiles: dev application: name: springcloud-config-eureka #配置Eureka eureka: instance: hostname: eureka7001.com #Eureka服务器的实例名称 client: register-with-eureka: false #表示是否想eureka注册中心注册自己 fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心 service-url: #监控页面 # 单击配置:defaultZon: http://${eureka.instance.hostname}:${server.port}/eureka/ # 集群(关联): defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ --- server: port: 7001 spring: profiles: test application: name: springcloud-config-eureka #配置Eureka eureka: instance: hostname: eureka7001.com #Eureka服务器的实例名称 client: register-with-eureka: false #表示是否想eureka注册中心注册自己 fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心 service-url: #监控页面 # 单击配置:defaultZon: http://${eureka.instance.hostname}:${server.port}/eureka/ # 集群(关联): defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
-
创建项目springcloud-config-eureka-7001
-
导入相关依赖
<!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>2.1.1.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.4.6.RELEASE</version> </dependency> <!--热部署--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
-
配置application.yml和bootstrap.yml文件
application.yml
spring: application: name: springcloud-config-eureka-7001
bootstrap.yml
#系统级别的配置 spring: cloud: config: uri: http://localhost:3344 name: config-eureka #需要从git上读取的资源名称,不要后缀 label: master profile: dev
-
创建启动类
package com.ddf.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer //EnableEurekaServer 服务端的启动类,可以接受别人注册进来 public class ConfigEurekaServer_7001 { public static void main(String[] args) { SpringApplication.run(ConfigEurekaServer_7001.class, args); } }
-
启动项目访问:http://localhost:7001/,就可以通过本地的项目访问到远程仓库的Eureka
5.在远程仓库部署Dept-8001
-
在Gitee上创建config-dept配置文件,部署dept-8001配置
spring: profiles: active: dev --- server: port: 8001 #mybatis配置 mybatis: type-aliases-package: com.ddf.springcloud.pojo mapper-locations: classpath:mapper/*.xml configuration-properties: classpath:mybatis/mybatis-config.xml #spring的配置 spring: profiles: dev application: name: springcloud-config-dept datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://localhost:3306/db01?userUnicode=true&characterEncoding=UTF-8 username: root password: 123 #eureka的配置 eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ instance: instance-id: springcloud-provider-dept8001 #修改eureka上的Status #配置Status的信息 info: app.name: ddf-springcloud company.name: blog.ddf.com --- server: port: 8002 #mybatis配置 mybatis: type-aliases-package: com.ddf.springcloud.pojo mapper-locations: classpath:mapper/*.xml configuration-properties: classpath:mybatis/mybatis-config.xml #spring的配置 spring: profiles: test application: name: springcloud-config-dept datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://localhost:3306/db02?userUnicode=true&characterEncoding=UTF-8 username: root password: 123 #eureka的配置 eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ instance: instance-id: springcloud-provider-dept8001 #修改eureka上的Status #配置Status的信息 info: app.name: ddf-springcloud company.name: blog.ddf.com
-
创建项目springcloud-config-dept-8001
-
导入依赖
<!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> <version>2.1.1.RELEASE</version> </dependency> <!--eureka--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.4.6.RELEASE</version> </dependency> <!--actuator完善监控信息--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--我们需要拿到实体类,所有要配置api module--> <dependency> <groupId>org.example</groupId> <artifactId>springcloud-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--引用父类的jar包--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> </dependency> <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> </dependency> <!--test--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-test</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--jetty--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jetty</artifactId> </dependency> <!--热部署工具,可以不用频繁的重启项目--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
-
创建Dao层:DeptDao
package com.ddf.springcloud.dao; import com.ddf.springcloud.pojo.Dept; import org.apache.ibatis.annotations.Mapper; import org.springframework.stereotype.Repository; import java.util.List; @Mapper @Repository public interface DeptDao { //添加 public boolean addDept(Dept dept); //通过id查询 public Dept findById(Long id); //查询所有 public List<Dept> findAll(); }
-
创建service层:DeptService和DeptServiceImpl
DeptService
package com.ddf.springcloud.service; import com.ddf.springcloud.pojo.Dept; import java.util.List; public interface DeptService { //添加 public boolean addDept(Dept dept); //通过id查询 public Dept findById(Long id); //查询所有 public List<Dept> findAll(); }
DeptServiceImpl
package com.ddf.springcloud.service; import com.ddf.springcloud.dao.DeptDao; import com.ddf.springcloud.pojo.Dept; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @Service public class DeptServiceImpl implements DeptService { @Autowired private DeptDao deptDao; public boolean addDept(Dept dept) { return deptDao.addDept(dept); } public Dept findById(Long id) { return deptDao.findById(id); } public List<Dept> findAll() { return deptDao.findAll(); } }
-
创建Controller层:DeptController
package com.ddf.springcloud.controller; import com.ddf.springcloud.pojo.Dept; import com.ddf.springcloud.service.DeptService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; import java.util.List; //提供Restful服务 @RestController public class DeptController { @Autowired private DeptService deptService; //获取一些配置的信息,得到具体的微服务 @Autowired private DiscoveryClient client; @PostMapping("/dept/add") public boolean addDept(Dept dept){ return deptService.addDept(dept); } @GetMapping("/dept/get/{id}") public Dept getDept(@PathVariable Long id){ return deptService.findById(id); } @GetMapping("/dept/list") public List<Dept> findAll(){ return deptService.findAll(); } //通过注册进来的微服务,去获取一些消息 @GetMapping("/dept/discovery") public Object discovery(){ //获取微服务列表的清单 List<String> services = client.getServices(); System.out.println("获取到了微服务的信息:" + services); //得到一个具体的微服务新,通过具体的微服务id,application List<ServiceInstance> instances = client.getInstances("SPRINGCLOUD-PROVIDER-DEPT"); //打印出相关信息 for(ServiceInstance instance : instances){ System.out.println(instance.getHost()); System.out.println(instance.getPort()); System.out.println(instance.getUri()); System.out.println(instance.getServiceId()); } return this.client; } }
-
创建启动类:ConfigEurekaDept_8001
package com.ddf.springcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient //在服务启动后自动注册到Eureka中,开启Eureka的连接 @EnableDiscoveryClient //服务发现 public class ConfigEurekaDept_8001 { public static void main(String[] args) { SpringApplication.run(ConfigEurekaDept_8001.class, args); } }
-
启动项目访问:http://localhost:8001/,就可以通过本地的项目访问到远程仓库的8001端口了