8、Hystrix
分布式系统面临的问题
复杂的分布式体系结构中的应用程序有数十个依赖关系,每个依赖关系在某些时候将不可避免地失败!
服务雪崩
多个微服务之间调用的时候,假设微服务A调用微服务B和微服务C,微服务B和微服务C又调用其他的微服务,这就是所谓的“扇出”,如果“扇出”的链路上某个微服务的调用响应时间过长或者不可用,对微服务A的调用就会占用越来越多的系统资源,进而引起系统崩溃,所谓的“雪崩效应”。
对于高流量的应用来说,单一的后端依赖可能会导致所有服务器上的所有资源都在几秒钟内饱和。比失败更糟糕的是,这些应用程序还可能导致服务之间的延迟增加,备份队列、线程和其他系统资源紧张,导致整个系统发生更多的级联故障,这些都表示需要对故障和延迟进行隔离和管理,以便单个依赖关系的失败,不能取消整个应用程序或系统。
我们需要 ’弃车保帅‘
什么是Hystrix
Hystrix是一个用于处理分布式系统的延迟和容错的开源库,在分布式系统里,许多依赖不可避免的会调用失败,比如超时、异常等,Hystrix能够保证在一个依赖出问题的情况下,不会导致整体服务失败,避免级联故障,以提高分布式系统的弹性。
“断路器”本身是一种开关装置,当某个服务单元发生故障之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个服务预期的,可处理的备选响应(FallBack),而不是长时间的等待或者抛出调用方法无法处理的异常,这样就可以保证了服务调用方的线程不会被长时间,不必要的占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
能干嘛
- 服务降级
- 服务熔断
- 服务限流
- 接近实时的监控
- ......
官网资料
http://github.com/Netflix/Hystrix/wiki
示意图:
8.1、服务熔断
是什么
熔断机制是对雪崩效应的一种微服务链路保护机制。
当扇出链路的某个微服务不可用或者响应时间太长,会进行服务的降级,进而熔断该节点微服务的调用,快速返回错误的响应信息。当检测到该节点微服务调用响应正常后恢复调用链路。在SpringCloud框架里熔断机制通过Hystrix实现。Hystrix会监控微服务间调用的情况,当失败的调用到一定阈值,缺省是5秒内20次调用失败就会启动熔断机制。熔断机制的注解是@HystrixCommand。
代码实现:
- 新建一个服务提供者,springcloud-provider-dept-hystrix-8001,与springcloud-provider-dept-8001相同,添加hystrix依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.2.10.RELEASE</version> </dependency>
修改配置文件
#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-dept-hystrix-8001 #修改eureka上的默认描述信息! hostname: localhost #修改主机名称 prefer-ip-address: true # true,可以显示服务的ip地址~
- 重写controller层DeptController.java实现Hystrix服务熔断
//提供Restful服务! @RestController public class DeptController { @Autowired private DeptService deptService; @GetMapping("/dept/get/{id}") @HystrixCommand(fallbackMethod = "hystrixGet") public Dept get(@PathVariable("id") Long id){ Dept dept = deptService.queryDeptById(id); if (dept==null){ throw new RuntimeException("id=>"+id+",不存在该用户,或者信息无法找到~"); } return dept; } //备选方法 public Dept hystrixGet(@PathVariable("id") Long id){ return new Dept() .setDeptno(id) .setDname("id=>"+id+"没有对应的信息,null--@Hystrix") .setDb_source("no this database in MySQL"); } }
- 启动类添加对Hystrix的支持@EnableHystrix
//启动类 @SpringBootApplication @EnableEurekaClient //在服务启动后自动注册到Eureka中! @EnableDiscoveryClient //服务发现~ @EnableHystrix //添加对熔断的支持,新版包含EnableCircuitBreaker public class DeptProviderHystrix_8001 { public static void main(String[] args) { SpringApplication.run(DeptProviderHystrix_8001.class,args); } }
- 启动Eureka集群,hystrix服务提供者及消费者,先访问Eureka,可以指定服务提供者显示ip地址
- 使用消费者查询数据库不存在的信息,发现未报错,页面显示指定的信息
8.2、服务降级
服务降级是当服务器压力剧增的情况下,根据当前业务情况及流量对一些服务和页面有策略的降级,以此释放服务器资源以保证核心任务的正常运行。
什么是服务降级
服务降级,就是对不怎么重要的服务进行低优先级的处理。说白了,就是尽可能的把系统资源让给优先级高的服务。资源有限,而请求是无限的。如果在并发高峰期,不做服务降级处理,一方面肯定会影响整体服务的性能,严重的话可能会导致宕机某些重要的服务不可用。所以,一般在高峰期,为了保证网站核心功能服务的可用性,都要对某些服务降级处理。
是消费者使用的一种应对服务提供者无响应的策略。
代码实现:
- 在实体类模块springcloud-api中新建一个service类
DeptClientServiceFallbackFactory.java,实现FallbackFactory方法,返回DeptClientService并重写方法,并将该类注入Spring中@Component
//降级~ @Component public class DeptClientServiceFallbackFactory implements FallbackFactory { @Override public DeptClientService create(Throwable cause) { return new DeptClientService() { @Override public Dept queryById(Long id) { return new Dept() .setDeptno(id) .setDname("id=>"+id+"没有对应的信息,客户端提供了降级的信息,这个服务现在已经被关闭了") .setDb_source("没有数据~"); } @Override public List<Dept> queryAll() { return null; } @Override public boolean addDept(Dept dept) { return false; } }; } }
- 在实体类模块springcloud-api中service层的DeptClientService接口中指定fallbackFactory所指向的类
@Component @FeignClient(value = "SPRINGCLOUD-PROVIDER-DEPT",fallbackFactory = DeptClientServiceFallbackFactory.class) public interface DeptClientService { @GetMapping("/dept/get/{id}") public Dept queryById(@PathVariable("id") Long id); @GetMapping("/dept/list") public List<Dept> queryAll(); @PostMapping("/dept/add") public boolean addDept(Dept dept); }
- 在消费者springcloud-consumer-dept-feign中导入依赖
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.2.10.RELEASE</version> </dependency>
- 在配置文件application.yml中开启降级feign.hystrix(新版配置不同)
server: port: 80 #开启降级feign.hystrix(新版配置不同) feign: circuitbreaker: enabled: true #Eureka配置 eureka: client: register-with-eureka: false #不向Eureka注册自己 service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
- 启动Eureka集群及消费者springcloud-consumer-dept-feign,使用消费者进行访问,找不到服务则显示预定内容不会报错。
8.3、服务熔断与服务降级简单对比
服务熔断:服务端,某个服务超时或者异常,引起熔断,保险丝~。
服务降级:客户端~,从整个网站请求负载考虑,当某个服务熔断或者关闭之后,服务将不再被调用,此时在客户端,我们可以准备一个FallbackFactory,返回一个默认的值(缺省值),整体的服务水平下降了,但是好歹能用。
8.4、Dashboard流监控
控制面板信息:
- 如何看
- 七色
- 一圈
实心圈:共有两种含义,它通过颜色的变化代表了实例的健康程度
它的健康程度从绿色<黄色<橙色<红色 递减
该实心圆除了颜色的变化之外,它的大小也会根据实例的请求流量发生变化,流量越大,该实心圆就越大,所以通过该实心圆的展示,就可以在大量的实例中快速发现故障实例和高压力实例。
- 一线
曲线:用来记录2分钟内流量的相对变化,可以通过它来观察到流量的上升和下降趋势!
代码实现:
- 创建一个监控页面springcloud-consumer-hystrix-dashboard,导入hystrix和dashboard依赖
<!--Hystrix依赖--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.2.10.RELEASE</version> </dependency> <!--Dashboard依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> <version>2.2.10.RELEASE</version> </dependency>
- 新建配置文件application.yml
server: port: 9001 hystrix: dashboard: proxy-stream-allow-list: "localhost"
- 新建一个启动类DeptConsumerDashboard_9001.java
@SpringBootApplication @EnableHystrixDashboard //开启监控 public class DeptConsumerDashboard_9001 { public static void main(String[] args) { SpringApplication.run(DeptConsumerDashboard_9001.class,args); } }
- 将服务提供者springcloud-provider-dept-hystrix-8001放入监控面板,导入hystrix和监控依赖,在启动类增加一个Servlet
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.2.10.RELEASE</version> </dependency> <!--actuator完善监控信息--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
//启动类 @SpringBootApplication @EnableEurekaClient //在服务启动后自动注册到Eureka中! @EnableDiscoveryClient //服务发现~ @EnableHystrix //添加对熔断的支持,新版包含EnableCircuitBreaker public class DeptProviderHystrix_8001 { public static void main(String[] args) { SpringApplication.run(DeptProviderHystrix_8001.class,args); } //增加一个Servlet public ServletRegistrationBean hystrixMetricsStreamServlet(){ ServletRegistrationBean registrationBean = new ServletRegistrationBean(new HystrixMetricsStreamServlet()); registrationBean.addUrlMappings("/actuator/hystrix.stream"); return registrationBean; } }
- 启动EurekaServer_7001,DeptProviderHystrix_8001及DeptConsumerDashboard_9001进行测试
- 访问Hystrix Dashboard面板
- 使用服务提供者进行查询后,查看/actuator/hystrix页面
- 根据查询页面填写Dashboard页面信息进行监视
- 最后查看监视页面
9、Zuul路由网关
9.1、概述
什么是Zuul?
Zuul包含了对请求的路由和过滤两个最主要的功能:
其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础,而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。Zuul和Eureka进行整合,将Zuul自身注册为Eureka服务治理下的应用,同时从Eureka中获得其他微服务的消息,也即以后的访问微服务都是通过Zuul跳转后获得。
注意:Zuul服务最终还是会注册进Eureka
提供:代理 + 路由 + 过滤 三大功能!
Zuul能干嘛?
- 路由
- 过滤
官网文档:https://github.com/Netflix/zuul
Zuul示意图:
9.2、代码实现:
- 新建springcloud-zuul-9527模块,增加依赖
<!--实体类+web--> <dependencies> <!--zuul依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-zuul</artifactId> <version>2.2.10.RELEASE</version> </dependency> <!--Hystrix依赖--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.2.10.RELEASE</version> </dependency> <!--Dashboard依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId> <version>2.2.10.RELEASE</version> </dependency> <!--feign--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> <version>1.4.7.RELEASE</version> </dependency> <!--Eureka--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.7.RELEASE</version> </dependency> <dependency> <groupId>com.kuang</groupId> <artifactId>springcloud-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--热部署工具--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> </dependencies>
- 新建配置文件application.yml,对Zuul进行配置
server: port: 9527 spring: application: name: springcloud-zuul #Eureka的配置,服务注册到哪里 eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ instance: instance-id: zuul9527.com #修改eureka上的默认描述信息! hostname: "localhost" #修改主机名称 prefer-ip-address: true # true,可以显示服务的ip地址~ #解决url过滤问题 management: endpoints: web: exposure: include: "*" #info配置,无效,创建单独的build-info.properties解决,注意格式 info: app-name: kuangshen-springcloud company-name: blog.kuangstudy.com zuul: routes: mydept: serviceId: springcloud-provider-dept path: /mydept/** ignored-services: "*" #不能再使用这个路径访问了,ignored : 忽略,隐藏全部的 prefix: /kuang #设置访问时统一的前缀
- 新建启动类,开启Zuul
@SpringBootApplication @EnableEurekaClient @EnableZuulProxy //开启Zuul public class ZuulApplication_9527 { public static void main(String[] args) { SpringApplication.run(ZuulApplication_9527.class,args); } }
- 启动Eureka,provider8001,及zuul9527进行测试
警告:该部分经反复尝试debug,修改springboot及springcloud版本、加拦截器配置类、增加ribbon时间、修改配置文件等操作,均不能解决不能通过Zuul访问其他服务的问题,只能实现将Zuul加入eureka并且访问Zuul服务。在该版本中尚未找到可用的解决方案,目前只能使用其他方法实现网关的功能。
10、SpringCloud config分布式配置(Git)
10.1、概述
分布式系统面临的--配置文件的问题
微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务,由于每个服务都需要必要的配置信息才能运行,所以一套集中式的、动态的配置管理设施是必不可少的。SpringCloud提供了ConfigServer来解决这个问题,我们每一个微服务自己带着一个application.yml,那上百的配置文件要修改起来,岂不是要疯!
什么是SpringCloud config分布式配置中心
SpringCloud Config为微服务架构中的微服务提供集中化的外部配置支持,配置服务器为各个不同微服务应用的所有环节提供了一个中心化的外部配置。
SpringCloud Config分为服务端和客户端两部分;
服务端也称为分布式配置中心,它是一个独立的微服务应用,用来连接配置服务器并为客户端提供获取配置信息、加密、解密信息等访问接口。
客户端则是通过指定的配置中心来管理应用资源,以及与业务相关的配置内容,并在启动的时候从配置中心获取和加载配置信息。配置服务器默认采用git来存储配置信息,这样就有助于对环境配置进行版本管理。并且可以通过git客户端工具来方便的管理和访问配置内容。
SpringCloud Config分布式配置中心能干嘛
- 集中管理配置文件
- 不同环境,不同配置,动态化的配置更新,分环境部署,比如 /dev /test /prod /beta /release
- 运行期间动态调整配置,不再需要在每个服务部署的机器上编写配置文件,服务会向配置中心统一拉取配置自己的信息。
- 当配置发生变动时,服务不需要重启,即可感知到配置的变化,并应用新的配置
- 将配置信息以REST接口的形式暴露
SpringCloud Config分布式配置中心与github整合
由于SpringCloud Config默认使用Git来存储配置文件(也有其他方式,比如支持SVN和本地文件),但是最推荐的还是Git,而且使用的是http/https访问的形式;
10.2、Git环境搭建
- 注册码云Gitee账号,登录,新建仓库springcloud-config,设置如下图
- 下载并安装最新版Git,在Git本地仓库文件夹下右键打开git bash here
- 在git中输入以下命令查看是否存在.ssh文件,如果存在则d到该文件目录中备份后删除,保证不存在该文件
~/.ssh
- 在git中输入以下命令并连续三次回车,以生成ssh公开密钥(邮箱可随意输入,只是密钥名称,习惯输入邮箱)
ssh-keygen -t ed25519 -C "406623380@qq.com"
- 输入以下指令查看ssh密钥,在码云中
设置/安全设置/SSH公钥
中添加公钥,将公钥全部信息复制到这里并设置标题
cat ~/.ssh/id_ed25519.pub
- 在码云该项目的首页点击
克隆/下载
复制ssh地址,然后在git中输入以下指令克隆该项目
git clone git@gitee.com:wydilearn/springcloud-config.git
输入yes继续clone
- 输入以下四个指令,将本地仓库中新建的application.yml文件上传到Gitee仓库中并在master分支中显示
git add . git status #可以查看到新建的文件 git commit -m "first commit" #提交新文件,本次提交的名字可以随便取 git push origin master #将文件上传至master分支
- 在码云的该项目中可查看到新上传的文件
10.3、服务端连接Git配置
- 新建一个服务端配置模块springcloud-config-server-3344,导入依赖
<dependencies> <!--config--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-config-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-config-server</artifactId> <version>3.1.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--Eureka--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.7.RELEASE</version> </dependency> </dependencies>
- 新建配置文件application.yml连接远程仓库,获取Gitee中仓库的https地址作为uri
server: port: 3344 spring: application: name: springcloud-config-server # 连接远程仓库 cloud: config: server: git: uri: https://gitee.com/wydilearn/springcloud-config.git # https,不是git
- 新建一个启动类Config_Server_3344.java,启用服务端配置
@SpringBootApplication @EnableConfigServer // public class Config_Server_3344 { public static void main(String[] args) { SpringApplication.run(Config_Server_3344.class,args); } }
- 启动该模块进行测试,访问以下三个路径可访问到Gitee仓库的文件
10.4、客户端连接服务端访问远程
- 在本地springcloud-config项目下新建配置文件config-client.yml
spring: profiles: active: dev --- server: port: 8201 #spring的配置 spring: profiles: dev application: name: springcloud-provider-dept #Eureka的配置,服务注册到哪里 eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ --- server: port: 8202 #spring的配置 spring: profiles: test application: name: springcloud-provider-dept #Eureka的配置,服务注册到哪里 eureka: client: service-url: defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
- 使用Git上传该配置文件到Gitee项目中,与之前文件上传操作类似
- 在IDEA中新建客户端配置模块springcloud-config-client-3355,导入依赖,与服务端模块依赖略有不同
<dependencies> <!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--Eureka--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.7.RELEASE</version> </dependency> </dependencies>
- 新建两个配置文件application.yml与bootstrap.yml
bootstrap.yml
# 系统级的配置 spring: cloud: config: uri: http://localhost:3344 #连接本地服务,通过本地服务到Gitee获取 name: config-client #需要从git上读取的资源名称,不要后缀 profile: dev #拿到文件中的哪个生产环境 label: master #哪个分支 http://localhost:3344/master/config-client-dev.yml
application.yml
# 用户级的配置 spring: application: name: springcloud-config-client-3355
此时未配置端口,默认为dev端口8201,可自行设置端口
- 新建一个controller层文件ConfigClientController.java获取Gitee中的配置文件并展示
@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 "applicationName:" + applicationName + "eurekaServer:" + eurekaServer + "port:" + port; } }
- 新建启动类ConfigClient_3355.java
@SpringBootApplication public class ConfigClient_3355 { public static void main(String[] args) { SpringApplication.run(ConfigClient_3355.class,args); } }
- 同时启动服务端配置模块与客户端配置模块进行测试,可通过客户端模块读取配置信息
10.5、远程配置实战测试
- 在本地Git项目中新建连个配置文件config-eureka.yml及config-dept.yml并上传,git上传操作与之前相同
config-dept.yml
spring: profiles: active: dev --- server: port: 8001 #mybatis配置 mybatis: type-aliases-package: com.kuang.springcloud.pojo config-location: classpath:mybatis/mybatis-config.xml mapper-locations: classpath:mybatis/mapper/*.xml #spring的配置 spring: profiles: dev application: name: springcloud-config-dept datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db02?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT username: root password: 123456 #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-dept-8001 #修改eureka上的默认描述信息! hostname: localhost #修改主机名称 #解决url过滤问题 management: endpoints: web: exposure: include: "*" --- server: port: 8001 #mybatis配置 mybatis: type-aliases-package: com.kuang.springcloud.pojo config-location: classpath:mybatis/mybatis-config.xml mapper-locations: classpath:mybatis/mapper/*.xml #spring的配置 spring: profiles: test application: name: springcloud-config-dept datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/db01?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT username: root password: 123456 #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-dept-8001 #修改eureka上的默认描述信息! hostname: localhost #修改主机名称 #解决url过滤问题 management: endpoints: web: exposure: include: "*"
config-eureka.yml
spring: profiles: active: dev --- server: port: 7001 #spring的配置 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: #监控页面~ # 单机: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 集群(关联): defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ --- server: port: 7001 #spring的配置 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: #监控页面~ # 单机: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 集群(关联): defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/ --- server: port: 7001 #Eureka配置 eureka: instance: hostname: eureka7001.com #Eureka服务端的实例名称 client: register-with-eureka: false #表示是否向eureka注册中心注册自己 fetch-registry: false #fetch-registry如果为false,则表示自己为注册中心 service-url: #监控页面~ # 单机: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ # 集群(关联): defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/
- 新建springcloud-config-eureka-7001模块,内容与springcloud-eureka-7001相同,导入依赖,新建配置文件application.yml及bootstrap.yml
<!--导包--> <dependencies> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> <version>1.4.7.RELEASE</version> </dependency> <!--热部署工具--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency> <!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> </dependencies>
application.yml
spring: application: name: springcloud-config-eureka-7001
bootstrap.yml
spring: cloud: config: name: config-eureka label: master profile: dev uri: http://localhost:3344
- 新建springcloud-config-dept-8001模块,内容与springcloud-provider-dept-8001相同,导入依赖,新建application.yml及bootstrap.yml
<dependencies> <!--Hystrix依赖--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-hystrix --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-hystrix</artifactId> <version>2.2.10.RELEASE</version> </dependency> <!--EUREKA依赖--> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-eureka --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> <version>1.4.7.RELEASE</version> </dependency> <!--actuator完善监控信息--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--我们需要拿到实体类,所以要配置api module--> <dependency> <groupId>com.kuang</groupId> <artifactId>springcloud-api</artifactId> <version>1.0-SNAPSHOT</version> </dependency> <!--junit--> <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> <!--config--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-bootstrap</artifactId> </dependency> </dependencies>
application.yml
spring: application: name: springcloud-config-dept-8001
bootstrap.yml
spring: cloud: config: name: config-dept label: master profile: test uri: http://localhost:3344
- 启动springcloud-config-server-3344,springcloud-config-eureka-7001,springcloud-config-dept-8001三个模块进行测试,发现服务在eureka中注册,并且可以通过服务查询数据库
11、SpringCloud Netflix思维导图