SpringCloud(三)

一.Hystrix(续)

1.Ribbon整合Hystrix

(1)在Ribbon的工程中,添加Hystrix的依赖

<!-- hystrix 依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
</dependency>

(2)在启动类上添加注解

@EnableHystrix

(3)在使用RestTemplate的地方,通过注解实现资源隔离

//使用注解,隔离其他服务的调用资源,被该注解标记的方法会被Hystrix提供的线程调用(线程池隔离)
//fallbackMethod就是指定降级方法,当资源不足或者服务报错时,会走降级方法
//熔断器默认已经开启
@HystrixCommand(fallbackMethod = "myFallBack")
@RequestMapping("/queryName")
public String getNameById(Integer sid){
    ......
}

/**
 * 降级方法
 * @param sid
 * @return
 */
public String myFallBack(Integer sid){
    return "服务异常,降级方法调用!!!";
}

2.Feign整合Hystrix

(1)直接通过配置yml文件,开启Hystrix

#开启Feign的断路器功能      
feign:
  hystrix:
    enabled: true

注意:Feign中已经整合了Hystrix,所以不需要添加任何依赖,Feign中的Hystrix功能默认关闭
(2)配置Feign接口,编写降级实现类

@FeignClient(value = "MIRCO-TEACHER", fallback = ITeacherFeign.TeacherFeign.class)
public interface ITeacherFeign {

    @RequestMapping("/tea/queryTeaName")
    String queryTeaName(@RequestParam("tid") Integer tid);


    /**
     * Feign接口的实现类
     */
    @Component
    public static class TeacherFeign implements ITeacherFeign{

        //就是对应的降级方法
        @Override
        public String queryTeaName(Integer tid) {
            return "教师服务调用异常,服务进行降级!!!";
        }
    }
}

3.Hystrix的常用配置-yml文件

#配置Hystrix的常用属性
hystrix:
  command:
    default:
      execution:
        isolation:
          #资源隔离的策略,线程池隔离(默认)、信号量隔离(SEMAPHORE)
          strategy: THREAD
          #hystrix超时时间,默认1秒
          thread:
            timeoutInMilliseconds: 500
        timeout:
          #是否开启Hystrix的超时时间, 默认为true,如果设置为false,
          #意为不超时,但是Feign的超时仍然起作用
          enabled: true
      #熔断器的相关配置,默认打开熔断器
      circuitBreaker:
        enabled: true
        #单位时间内,失败的次数,如果达到这个阈值,那么熔断器就会打开,默认20次
        requestVolumeThreshold: 5
        #多久之后,熔断器进入半开状态,默认5S
        sleepWindowInMilliseconds: 5000

注意:实际开发过程中,调用超时,需要结合Feign的超时和Hystrix的超时,哪个超时设置的小,哪个就起作用,默认都是1S。

4.Hystrix的仪表盘(图形化界面监控)

(1)简介
Hystrix提供了一个组件,可以监控Hystrix的微服务,来动态掌握各个微服务之间的请求调用情况。
(2)配置Hystrix的仪表盘
1)单独创建一个SPringBoot项目,作为仪表盘工程
2)该工程添加依赖仪表盘工程

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix-dashboard</artifactId>
</dependency>

3)配置启动注解仪表盘工程

@EnableHystrixDashboard

4)启动该工程

Hystrix显示页面

5)去到需要监控的工程,配置监控Servlet
①添加依赖

//添加监控依赖
<dependency>
    <groupId>com.netflix.hystrix</groupId>
    <artifactId>hystrix-metrics-event-stream</artifactId>
    <version>1.5.18</version>
    <scope>compile</scope>
</dependency>

②配置servlet

//启动类配置监控的Servlet
@Bean
    public ServletRegistrationBean<HystrixMetricsStreamServlet> getServlet(){
        HystrixMetricsStreamServlet hystrixMetricsStreamServlet 
            = new HystrixMetricsStreamServlet();
        ServletRegistrationBean<HystrixMetricsStreamServlet> 
            servletRegistrationBean = new ServletRegistrationBean();
        servletRegistrationBean.setServlet(hystrixMetricsStreamServlet);
        servletRegistrationBean.addUrlMappings("/hystrix.stream");
        servletRegistrationBean.setName("HystrixMetricsStreamServlet");
        return servletRegistrationBean;
    }

6)去到仪表盘工程,配置监控地址即可

监控页面

注意:Hystrix的仪表盘,不需要注册到注册中心上,是一个独立的工程就可以了

二.路由网关

1.简介

简单来说,路由网关往往是微服务架构的入口组件,外来的所有的请求,都需要通过路由网关进行分发和过滤。路由网关的核心功能:请求的路由请求的过滤

2.功能作用

(1)路由网关提供了外部请求的访问入口,所有的外部请求都只需要知道路由网关的地址就行了,无需知道每个微服务的访问地址,路由网关可以将外部的请求负载分发给不同的微服务,这样可以对外屏蔽微服务架构内部的结构。因为路由网关往往是外部请求访问微服务架构的入口,所以可以在路由网关做请求过滤的工作。具体如下图所示:

路由网关工作原理

(2)SpringCloud默认提供了2个路由网关,Zuul和Gateway,Zuul是网飞(netflix)提供的路由组件,而Gateway是SpringCloud团队自己开发的一款路由组件,用来替换Zuul的

3.路由网关的请求路由实现--Gateway

(1)创建一个微服务工程,注意该微服务工程不能添加web依赖
(2)添加Gateway依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

(3)配置application.yml

server:
  port: 18888
spring:
  application:
    name: gateway-server
  #配置路由网关的路由规则
  cloud:
    gateway:
      routes:
          #id:规则的标识,是一个合法不重复的字符串即可
        - id: guize1
          #predicates:路由规则,什么样的请求,匹配当前这个规则
          predicates:
            # http://localhost:18888/stu/a/b
            - Path=/stu/**
          #当前的规则,分发给哪个微服务
          #http://MICRO-STUDENT/stu/a/b
          uri: lb://MICRO-STUDENT
 
eureka:
  client:
    service-url:
      defaultZone: http://localhost:20000/eureka

三.分布式统一配置中心

统一配置中心

1.统一配置中心的搭建(服务端)

(1)创建一个工程(可以不是微服务,不用注册到注册中心上)
(2)添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-config-server</artifactId>
</dependency>

(3)启动类添加注解

@EnableConfigServer

(4)配置application.yml

server:
  port: 40000
spring:
  application:
    name: config-server
  #读取本地配置文件,强制需要配置该属性
  profiles:
    active: native
  cloud:
    config:
      server:
        #配置文件放到本地
        native:
          search-locations: classpath:config
        #配置文件放到svn上的配置
#        svn:
#          uri: #svn仓库的地址
        #配置文件放到git上的配置
#        git:
#          uri: xxxxxxxx #配git仓库的地址,git仓库里放的就是各种配置文件

(5)在config文件夹中,准备一个样例配置文件

com:
  name: zhangsan

(6)运行配置中心,测试是否能都读到管理的配置信息

展示效果

2.微服务配置的统一管理(其他微服务的配置全部交由统一配置中心管理)

(1)将所有微服务的application.yml放到统一配置中心的指定目录下(git、svn需要传到指定的仓库中)
(2)所有微服务添加依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
</dependency>

(3)所有的微服务,添加一个配置文件bootstrap.yml
注意:bootstrap.yml用法和application.yml的用法完全一致,但是在SpringBoot启动过程中,是先加载bootstrap.yml再加载application.yml

spring:
  cloud:
    config:
      #配置统一配置中心的地址
      uri: http://localhost:40000
      #配置文件的名字
      name: teacher
      #配置文件的环境
      profile: local

(4)启动配置中心、再启动微服务


启动日志.png

注意:这里有一个强制的顺序要求,必须先启动配置中心,再启动微服务

3.注意事项

(1)如果配置文件是放在Config Server本地管理的,那么每次修改配置文件,都必须重启Config Server才会生效
(2)如果配置文件是放在Config Server的git、SVN仓库中管理的,那么每次修改配置文件,不用重启Config Server,会自动生效
(3)不管配置文件放在哪里,每次修改配置文件,所有的Config Client(微服务),都必须重启才有效。原因在于Config Client只有在启动的时候会去抓一次配置,然后配置就缓存到本地了,后续所有的代码都是从本地获得配置,因此服务的变化,是无感知的,这也是一种优化的结果

4.关于配置修改,需要重启所有微服务的解决方案

(1)统一配置中心的管理方案一

管理方案一

(2)统一配置中心的管理方案二 升级方案

管理方案二
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,732评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,496评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,264评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,807评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,806评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,675评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,029评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,683评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,704评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,666评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,773评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,413评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,016评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,204评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,083评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,503评论 2 343