微服务强调的是服务的大小,他关注的是服务个体,每个服务只解决一个具体功能或模块。
微服务架构是一种架构模式,提倡将单一的应用程序划分成一组小的服务,每个服务运行在其独立的进程中,服务之间相互协调、相互配合。服务之间采用轻量级的通信机制相互沟通(通常是基于HTTP的RESTful API,Dubbo是采用RPC远程过程调用),可以使用不同的语言来编写服务,也可以使用不同的数据存储。
Spring Cloud是基于SpringBoot的一套微服务解决方案,包括服务注册与发现,配置管理,全链路监控,服务网关,负载均衡,熔断器等组件。常用的五大组件:服务发现,负载均衡,断路器,服务网关,分布式配置。
Spring Boot专注于快速、方便的开发单个微服务个体,Spring Cloud是关注全局的微服务协调治理框架,将Spring Boot的微服务单体整合并管理起来。Spring Cloud离不开Spring Boot,属于依赖关系。
①Spring Cloud提供的功能要比Dubbo的多,Dubbo主要分为服务注册中心,服务注册与发现,服务监控,断路器;而Spring Cloud是完整的分布式一站式框架,包括服务注册中心,服务注册与发现,服务监控,断路器,服务网关,分布式配置,消息总线,服务追踪等。
②Spring Cloud服务调用采用基于HTTP的REST方式,Dubbo采用RPC远程调用。RPC(远程过程调用协议)
③Spring Cloud的实现是采用类注解方式,具有一定的侵入性;Dubbo是通过xml配置完成,代码侵入性很小。
Eureka是Netflix的一个子模块,是核心模块之一。Eureka是一个基于REST的服务,主要实现服务的注册与发现。
Eureka采用C-S的设计架构,包含两大组件:Eureka Server和Eureka Client。
Eureka Server作为服务注册功能的服务器,是服务注册中心。其他微服务使用Eureka Client连接到Eureka Server进行服务注册、服务发现。
pom.xml文件引入包
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-serverartifactId>
<version>2.1.2.RELEASEversion>
dependency>
application.yml文件配置
server:
port: 7001 #端口号
eureka:
instance:
hostname: localhost #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己
fetch-registry: false #false表示自己就是注册中心,维护服务实例,不检索服务
service-url:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都依赖的地址
主程序入口类加上注解
/**
* 服务注册中心
* 1.配置Eureka信息
* 2.标注@EnableEurekaServer注解,启动注册中心
*/
@EnableEurekaServer
@SpringBootApplication
public class EurekaServer7001_App {
pom.xml文件引入包
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-configartifactId>
<version>2.1.2.RELEASEversion>
dependency>
application.yml文件配置
server:
port: 8001
spring:
application:
name: microservicecloud-dept #*** 对外暴露的模块/服务名称
eureka:
client:
service-url:
defaultZone: http://localhost:7001/eureka #指定服务注册中心地址
instance:
instance-id: microservicecloud-dept:8001 #指定微服务的status名称
prefer-ip-address: true #注册服务的时候使用服务的ip地址,访问服务时显示ip地址
主程序入口类添加注解
@SpringBootApplication //SpringBoot核心注解
@EnableEurekaClient //开启服务自动注册
public class DeptProvider8001_App {
pom.xml文件导入监控包
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
在父pom文件中添加配置
<build>
<finalName>microservicecloudfinalName>
<resources>
<resource>
<directory>src/main/resourcesdirectory>
<filtering>truefiltering>
resource>
resources>
<plugins>
<plugin>
<groupId>org.apache.maven.pluginsgroupId>
<artifactId>maven-resources-pluginartifactId>
<configuration>
<delimiters>
<delimit>$delimit>
delimiters>
configuration>
plugin>
plugins>
build>
application.yml文件添加配置
info:
app.name: microservicecloud
company.name: www.zjl.com
build.artfactId: $project.artifactId$
build.version: $project.version$
Eureka Server在一定时间内没有接收到某个微服务实例的心跳(无服务操作)(默认90秒),Eureka会将该服务进入自我保护模式,保护服务注册表中的信息,不注销服务实例,当收到心跳时退出自我保护模式。
可以使用eureka.server.enable-self-preservation=false禁用自我保护模式。
导入pom依赖包
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
<version>2.1.2.RELEASEversion>
dependency>
主程序入口添加注解
@EnableDiscoveryClient //服务发现
microservicecloud-eureka-server-7001
server:
port: 7001 #端口号
eureka:
instance:
hostname: eureka-server-7001 #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己
fetch-registry: false #false表示自己就是注册中心,维护服务实例,不检索服务
service-url:
#单机eurekaserver配置
#defaultZone: http://eureka-server-7001:7001/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都依赖的地址
#eureka集群配置
defaultZone: http://eureka-server-7002:7002/eureka/,http://eureka-server-7003:7003/eureka/
microservicecloud-eureka-server-7002
server:
port: 7002 #端口号
eureka:
instance:
hostname: eureka-server-7002 #eureka服务端的实例名称
...
...
service-url:
defaultZone: http://eureka-server-7001:7001/eureka/,http://eureka-server-7003:7003/eureka/
microservicecloud-eureka-server-7003
server:
port: 7003 #端口号
eureka:
instance:
hostname: eureka-server-7003 #eureka服务端的实例名称
...
...
service-url:
defaultZone: http://eureka-server-7001:7001/eureka/,http://eureka-server-7002:7002/eureka/
C:\Windows\System32\drivers\etc下的hosts文件
# springcloud的eureka集群设置端口
127.0.0.1 eureka-server-7001
127.0.0.1 eureka-server-7002
127.0.0.1 eureka-server-7003
eureka:
client:
service-url:
#单机eureka配置
#defaultZone: http://localhost:7001/eureka #指定服务注册中心地址
#eureka集群配置
defaultZone: http://eureka-server-7001:7001/eureka,http://eureka-server-7002:7002/eureka,http://eureka-server-7003:7003/eureka
instance:
instance-id: microservicecloud-dept:8001 #指定微服务的status名称
prefer-ip-address: true #注册服务的时候使用服务的ip地址,访问服务时显示ip地址
关系型数据库的事务是ACID,原子性、一致性、独立性、持久性。
非关系型数据库的事务是CAP,强一致性、可用性、分区容错性。
CAP最多只能满足两个条件:
CA-单点集群,满足一致性,可用性的系统,通常早可扩展性上不太强大。
CP-满足一致性、分区容错性的系统,通常性能不是很高。
AP-满足可用性、分区容错性的系统,通常对一致性要求低点
Zookeeper保证CP原则,当服务对可用性的要求高时,可能出现服务瘫痪;
Eureka保证AP原则,保证高可用性,一致性稍弱,数据信息可能不是最新的,具有自我保护机制,可以应对因网络故障导致部分节点失去联系的情况。
Spring Cloud Ribbon是基于Netflix Ribbon实现的一套客户端负载均衡的工具,主要功能是提供客户端的软件负载均衡算法。
Load Balance,即负载均衡(LB),将用户的请求平摊地分配到多个服务上。
集中式LB:在服务的消费方和提供方之间使用独立的LB设施(可以是硬件,如F5,也可以是软件,如nginx),由该设施负载把访问请求根据某种策略转发到服务的提供方。
进程内LB:将LB逻辑集成到消费方,消费方从服务注册中心获知哪些地址可用,从可用的地址中选择合适的服务器。Ribbon就属于进程内LB。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-configartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
<version>2.1.2.RELEASEversion>
dependency>
@SpringBootApplication
@EnableEurekaClient
public class DeptConsumer80_App {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer80_App.class,args);
}
}
@LoadBalanced //开启负载均衡,轮询算法
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
//MICROSERVICECLOUD-DEPT为服务的Application名称
private static final String REST_URL_PREFIX="http://MICROSERVICECLOUD-DEPT/provider/dept";
@RequestMapping("/list")
public List<Dept> list(Dept dept){
return restTemplate.getForObject(REST_URL_PREFIX+"/list",List.class);
}
Rule有7种:
RoundRobinRule:轮询(默认的)
RandomRule:随机
AvailabilityFilteringRule
WeightedResponseTimeRule
RetryRule:先按照RoundRobinRule的策略获取服务,获取服务失败几次后,直接跳过该服务进行下一个服务的获取。
BestAvailableRule
ZoneAvoidanceRule
@Configuration
public class ConfigBean {
@LoadBalanced //开启负载均衡
@Bean
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
//切换负载均衡的规则
@Bean
public IRule myRule(){
//return new RoundRobinRule();
//return new RandomRule();
return new RetryRule();
}
}
自定义Rule类
public class RandomRule_ZY extends AbstractLoadBalancerRule
{
// total = 0 // 当total==5以后,我们指针才能往下走,
// index = 0 // 当前对外提供服务的服务器地址,
// total需要重新置为零,但是已经达到过一个5次,我们的index = 1
// 分析:我们5次,但是微服务只有8001 8002 8003 三台,OK?
//
private int total = 0; // 总共被调用的次数,目前要求每台被调用5次
private int currentIndex = 0; // 当前提供服务的机器号
public Server choose(ILoadBalancer lb, Object key)
{
if (lb == null) {
return null;
}
Server server = null;
while (server == null) {
if (Thread.interrupted()) {
return null;
}
List<Server> upList = lb.getReachableServers();
List<Server> allList = lb.getAllServers();
int serverCount = allList.size();
if (serverCount == 0) {
/*
* No servers. End regardless of pass, because subsequent passes only get more
* restrictive.
*/
return null;
}
// int index = rand.nextInt(serverCount);// java.util.Random().nextInt(3);
// server = upList.get(index);
// private int total = 0; // 总共被调用的次数,目前要求每台被调用5次
// private int currentIndex = 0; // 当前提供服务的机器号
if(total < 5)
{
server = upList.get(currentIndex);
total++;
}else {
total = 0;
currentIndex++;
if(currentIndex >= upList.size())
{
currentIndex = 0;
}
}
if (server == null) {
/*
* The only time this should happen is if the server list were somehow trimmed.
* This is a transient condition. Retry after yielding.
*/
Thread.yield();
continue;
}
if (server.isAlive()) {
return (server);
}
// Shouldn't actually happen.. but must be transient or a bug.
server = null;
Thread.yield();
}
return server;
}
@Override
public Server choose(Object key)
{
return choose(getLoadBalancer(), key);
}
@Override
public void initWithNiwsConfig(IClientConfig clientConfig)
{
// TODO Auto-generated method stub
}
}
向容器中注入RuleBean
@Configuration
public class MySelfRule
{
@Bean
public IRule myRule()
{
//return new RandomRule();// Ribbon默认是轮询,我自定义为随机
//return new RoundRobinRule();// Ribbon默认是轮询,我自定义为随机
return new RandomRule_ZY();// 我自定义为每台机器5次
}
}
使用自定义Rule
//在启动该微服务的时候就能去加载我们的自定义Ribbon配置类,从而使配置生效
@RibbonClient(name="MICROSERVICECLOUD-DEPT",configuration=MySelfRule.class)
//注意:MySelfRule类不能放在主程序类的同包和子包下,否则不能生效
public class DeptConsumer80_App
{
public static void main(String[] args)
{
SpringApplication.run(DeptConsumer80_App.class, args);
}
}
Feign是一个声明式的Web服务客户端,让编写Web Servicer客户端更加简单,只需定义一个接口,然后在上面添加注解即可。
Fegin通过接口的方法调用Rest服务代替之前的Ribbon+RestTemplate的编写。
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-ribbonartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-feignartifactId>
<version>1.4.6.RELEASEversion>
dependency>
@FeignClient(value="MICROSERVICECLOUD-DEPT")//要访问的服务名称,定义Feign客户端
@RequestMapping("/provider/dept/")
public interface DeptClientService {
@RequestMapping(value="/get/{id}",method = RequestMethod.GET)
public Dept get(@PathVariable("id") Integer id);
@RequestMapping(value = "/list",method = RequestMethod.GET)
public List<Dept> list();
@RequestMapping(value = "/add",method = RequestMethod.POST)
public boolean add(Dept dept);
}
@Autowired
private DeptClientService deptClientService;
@RequestMapping("/add")
public boolean add(Dept dept){
return deptClientService.add(dept);
}
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients(basePackages={"com.springcloud"}) //启动feign客户端 @FeignClient 是定义feign客户端
@ComponentScan("com.springcloud") //指定要扫描的包,将需要装配的类装配到spring的bean容器中
public class DeptConsumer80_feign_App {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer80_feign_App.class,args);
}
}
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,保证在一个依赖出现问题的情况下,不会导致整体服务失败,避免级联故障,提高分布式系统的弹性。
当某个服务单元发生故障之后,通过断路器的故障监控,向调用方返回一个符合预期的、可处理的被选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
熔断机制是应对雪崩效应的一种微服务链路保护机制,当某个服务不可用或相应时间太长时,会进行服务的降级,进而熔断该节点微服务的调用,快速返回“错误”的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。
创建相关客户端微服务,导入Hystrix的包
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-netflix-hystrixartifactId>
<version>2.1.2.RELEASEversion>
dependency>
编写服务失败后执行的方法,并配置
@RequestMapping(value = "/get/{id}",method = RequestMethod.GET)
@HystrixCommand(fallbackMethod="processHystrix_Get") //当方法异常时,自动执行processHystrix_Get方法,返回指定的信息
public Dept get(@PathVariable("id") Integer id){
Dept dept=deptService.get(id);
if(dept==null){//当dept不存在时,抛出异常
throw new RuntimeException("该ID:"+id+"没有对应的信息");
}
return dept;
}
public Dept processHystrix_Get(@PathVariable("id")Integer id){
return new Dept().setDeptno(id).setDname("该ID:"+id+"没有对应的信息,null--@HystrixCommand").setDb_source("no this database in MySQL");
}
主程序入口添加注解,开启Hystrix熔断机制的支持
@EnableCircuitBreaker //开启Hystrix熔断机制的支持
public class DeptProvider8001_hystrix_App {
public static void main(String[] args) {
SpringApplication.run(DeptProvider8001_hystrix_App.class,args);
}
}
当整体资源不够时,关闭某些服务,待资源紧张过后,再开启服务。
服务降级处理是在客户端实现完成的,与服务端没有关系
使用服务降级处理,让客户端在服务端不能使用时也能获得提示信息而不会挂死或耗死服务器。
创建工厂类,统一处理服务异常调用方法
@Component
public class DeptClientServiceFallbackFactory implements FallbackFactory<DeptClientService> {
@Override
public DeptClientService create(Throwable throwable) {
return new DeptClientService() {
@Override
public Dept get(Integer id) {
return new Dept().setDeptno(id).setDname("该ID:"+id+"没有对应的信息,Consumer客户端提供的降级信息,此刻服务Provider已经关闭").setDb_source("no this database in MySQL");
}
@Override
public List<Dept> list() {
return null;
}
@Override
public boolean add(Dept dept) {
return false;
}
};
}
}
使用FeignClient注解指定fallbackFactory
@FeignClient(value="MICROSERVICECLOUD-DEPT",fallbackFactory = DeptClientServiceFallbackFactory.class)
public interface DeptClientService {
@RequestMapping(value="/get/{id}",method = RequestMethod.GET)
public Dept get(@PathVariable("id") Integer id);
@RequestMapping(value = "/list",method = RequestMethod.GET)
public List list();
@RequestMapping(value = "/add",method = RequestMethod.POST)
public boolean add(Dept dept);
}
客户端服务配置
feign:
hystrix:
enabled: true #开启熔断器服务
准实时的调用监控(Hystrix Dashboard),Hystrix会持续地记录所有通过Hystrix发起的请求的执行信息,并以统计报表和图形的形式展示给用户。
搭建监控微服务
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-hystrixartifactId>
<version>1.4.1.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-hystrix-dashboardartifactId>
<version>1.4.1.RELEASEversion>
dependency>
主程序入口添加注解
@SpringBootApplication
@EnableHystrixDashboard //开启服务监控
public class DeptConsumer_DashBoard_App {
public static void main(String[] args) {
SpringApplication.run(DeptConsumer_DashBoard_App.class,args);
}
}
需要监控服务的导入监控相关的包
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
Zuul包含对请求的路由和过滤两个最重要的功能。路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础;过滤器功能负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。
创建路由服务module
<dependencies>
<dependency>
<groupId>com.springcloudgroupId>
<artifactId>microservicecloud-apiartifactId>
<version>${project.version}version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-coreartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<version>2.1.6.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<version>2.1.6.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-configartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-hystrixartifactId>
<version>1.4.1.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-zuulartifactId>
<version>1.4.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-configartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<version>2.1.6.RELEASEversion>
<optional>trueoptional>
dependency>
dependencies>
application.yml文件配置
server:
port: 9527
spring:
application:
name: microservicecloud-zuul-gateway
eureka:
client:
service-url:
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
instance:
instance-id: gateway-9527.com
prefer-ip-address: true
zuul:
#ignored-services: microservicecloud-dept
prefix: /atguigu
ignored-services: "*"
routes:
mydept.serviceId: microservicecloud-dept
mydept.path: /mydept/**
info:
app.name: atguigu-microcloud
company.name: www.atguigu.com
build.artifactId: $project.artifactId$
build.version: $project.version$
主程序入口添加注解
@SpringBootApplication
@EnableZuulProxy //开启路由代理
public class Zuul_9527_StartSpringCloudApp {
public static void main(String[] args) {
SpringApplication.run(Zuul_9527_StartSpringCloudApp.class,args);
}
}
使用路由访问
普通访问:http://localhost:8001/provider/dept/list
路由访问:http://localhost:9527/microservicecloud-dept/provider/dept/list
zuul:
prefix: /springcloud #统一的前缀
ignored-services: "*" #隐藏所有原访问路径,只能通过域名映射后的路径访问
routes:
mydept.serviceId: microservicecloud-dept #域名映射成/mydent/**
mydept.path: /mydept/**
原访问路径:http://localhost:9527/microservicecloud-dept/provider/dept/list
现访问路径:http://localhost:9527/springcloud/mydept/provider/dept/list
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环境提供了一个中心化的外部配置。
SpringCloud Config分为服务端和客户端两部分。
服务端称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息,加密、解密信息等访问接口。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理,并且可以通过git客户端工具来方便的管理和访问配置内容。
// 在github上创建仓库
git clone 仓库的ssh
// 仓库下创建application.yml文件
// 提交文件到仓库
git add .
git commit -m "说明信息"
git push origin master
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
dependency>
<dependency>
<groupId>ch.qos.logbackgroupId>
<artifactId>logback-coreartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<version>2.1.6.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<version>2.1.6.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-hystrixartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-configartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-config-serverartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<version>2.1.6.RELEASEversion>
<optional>trueoptional>
dependency>
dependencies>
server:
port: 3344
spring:
application:
name: microservicecloud-config
cloud:
config:
server:
git:
uri: [email protected]:lele961111/microservicecloud-config.git #github的仓库的ssh
eureka:
client:
register-with-eureka: false # 表示不向注册中心注册
fetch-registry: false # 由于注册中心的职责就是维护服务实例,所以它不需要去检索服务
@SpringBootApplication
@EnableConfigServer
public class Config_3344_StartSpringCloudApp {
public static void main(String[] args) {
SpringApplication.run(Config_3344_StartSpringCloudApp.class,args);
}
}
// 仓库下创建microservicecloud-config-client.yml文件
// 提交文件到仓库
git add .
git commit -m "说明信息"
git push origin master
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
<version>2.1.6.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-testartifactId>
<version>2.1.6.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-netflix-eureka-clientartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-configartifactId>
<version>2.1.2.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-hystrixartifactId>
<version>1.4.1.RELEASEversion>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<version>2.1.6.RELEASEversion>
<optional>trueoptional>
dependency>
dependencies>
bootstrap.yml
#application.yml 是用户级的资源配置项
#bootstrap.yml 是系统级的,优先级更高
spring:
cloud:
config:
name: microservicecloud-config-client #需要从github上读取的资源名称,没有yml后缀名
profile: dev #本次访问的配置项
label: master
uri: http://localhost:3344 #本微服务启动后先去找3344服务,通过SpringCloudConfig获取GitHub的服务地址
application.yml
spring:
application:
name: microservicecloud-config-client #要喝bootstarp的同名
eureka:
client:
register-with-eureka: false # 表示不向注册中心注册
fetch-registry: false # 由于注册中心的职责就是维护服务实例,所以它不需要去检索服务
@RestController
public class ConfigClientRest {
@Value("${spring.application.name}")
private String applicationName;
@Value("${eureka.client.service-url.defaultZone}")
private String eurekaServers;
@Value("${server.port}")
private String port;
@RequestMapping("/config")
public String getConfig(){
String str="applicationName:"+applicationName+"\t eurekaServers:"+eurekaServers+"\t port:"+port;
return str;
}
}
启动config服务器微服务,启动config客户端微服务,访问各端口下的/config