【总结】springcloud

一.spirngcloud概述

1.springcloud是什么?

spring cloud是一个一站式的开发分布式系统的框架,为开发人员提供了快速构建分布式系统中一些常见模式的工具(如:配置管理,服务发现,断路器,智能路由,微代理等)

2.springcloud版本

springcloud版本 springboot版本
Finchley 2.0.X
Edgware 1.5.X
Daslton 1.5.X
Camden 1.4.X
Brixton 1.3.X
Angel 1.2.X

二.eureka注册中心搭建(服务端)

1.服务注册中心Eureka

(1)Eureka是一个服务治理组件,主要包括服务注册和服务发现,主要用来搭建服务注册中心。是springcloud对netflix Eureka的二次封装
(2)采用c/s设计架构,分客户端和服务端。服务端是注册中心,而系统中其它微服务使用客户端连接到服务端,并保持心跳连接

2.eureka注册中心搭建-单点模式

(1)引入依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.RC2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

(2)入口类加@EnableEurekaServer注解,开启Eureka注册中心服务端
(3)在application.properties中配置

#端口
server-port=8761
#设置注册中心的hostname
eureka.instance.hostname=localhost
#禁止自己向自己注册
eureka.client.register-with-eureka=false
#不去检索其它服务,因为本身职责就是维护服务实例
eureka.client.fetch-register=false
#指定服务注册中心位置
eureka.client.service-url.defaultZone=http://localhost:8080/eureka/

3.eureka注册中心搭建-集群模式

7002,7003同理,相互注册

server:
  port: 7001

eureka:
  instance:
    hostname: eureka1 #eureka服务端的实例名称
  client:
    register-with-eureka: false     #false表示不向注册中心注册自己。
    fetch-registry: false     #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      # euraka集群
      defaultZone: http://eureka2:7002/eureka/,http://eureka3:7003/eureka

三.eureka客户端搭建

(1)eureka客户端依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-client</artifactId>
        </dependency>
</dependencies>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.RC2</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>  

(2)@EnableEurekaClient
表明自己是一个eureka客户端,让服务提供者可以连接eureka注册中心

(3)配置服务名和注册中心地址

server.port=9100
spring.application.name=provider1
eureka.client.service-url.defaultZone=http://localhost:8080/eureka/

四.服务发现与消费

服务发现(发现注册中心的服务)由eureka客户端实现,服务消费由Feign实现
Fegin是nexflix公司开发的声明式Rest调用客户端。feign还整合了Ribbon和hystrix两个组件
1.引入feign依赖
2.启动类加注解

@EnableFeignClients

3.声明服务
service包下定义一个接口,通过@FeignClient指定服务提供者名字

//括号里是远程服务名
@FeignClient("helloApplication")
public interface HelloService{
    //远程方法
    @RequestMapping("/service/hello")
    public String hello();
}

4.调用服务
controller包下

@RestController
public class FeignController{
    @Autowired
    private helloService HelloService;
    @Requestmapping("/web/hello")
    public String hello(){
        return helloService.hello()
    }
}

五.Eureka注册中心自我保护机制

在没有Eureka自我保护的情况下,如果Eureka Server在一定时间内(默认90s)没有接收到某个微服务实例的心跳,Eureka server将会注销该实例。但有时候仅仅是因为网络故障,直接注销就会很危险,因为微服务本身是正常的。所以在15分钟内,心跳失败率低于85%,就会触发自我保护机制,开启自我保护,只会在注册中心页面弹出红色的警告信息,eureka保留该服务。

1.关闭自我保护机制(服务器端)

#关闭自我保护机制
eureka.server.enable-self-preservation = false

2.自我保护机制下的某个服务,消费者还可以调取吗?

如果这个服务时真的故障了,那只是注册中心的服务地址列表里还保留了这个地址,当消费者拿到这个地址去调用的时候,还是调用不到的

3.注册中心挂掉,消费者还可以调用吗?

如果消费者已从注册中心拿到了这个服务地址列表,则可以调用

六.负载均衡(ribbon)

1.ribbon是什么?

Ribon是基于HTTP和TCP的客户端负载均衡器。在eureka客户端服务发现的基础上,实现对服务实例的选择策略,从而实现对服务的负载均衡消费

2.搭建服务消费者调用服务

(1)启动多个相同服务提供者(8060 8061 8062)
(2)消费者使用feign进行调用

3.负载均衡策略

策略 命名 描述
RandomRule 随机策略 随机选择server
RoundRobinRule 轮询策略 按照顺序选择server(ribbon默认策略)
AvailabilityFilteringRule 可用过滤策略 过滤掉不可用的和高并发的
ResponseTimeWeightedRule 响应时间加权重策略 根据server的响应时间分配权重,响应时间越长,权重越低,被选择到的概率也就越低。

4.配置:

(1)方式1:

@Configuration
public class RibbonConfiguration {

    @Bean
    public IRule ribbonRule() {
        return new RandomRule();
    }
}

(2)方式2:

client-a:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #针对client-a服务使用随机策略

七.服务熔断Hystrix

断路器
“断路器”是一种开关装置,当某个服务发生故障监控(类似熔断保险丝),向调用方法返回一个备选的响应,而不是长时间的等待或者抛出调用方法无法处理的异常,这样就保证了服务调用方的线程不会被长时间、不必要地占用,从而避免了故障在分布式系统中的蔓延,乃至雪崩。
熔断模式
在对某个服务调用不可用达到一个阈值,5秒内20次调用失败就会就会启动熔断模式。熔断器的开关是由服务的健康状况(服务的健康状况 = 请求失败数 / 请求总数)决定的。当断路器开关关闭时请求可以通过,一但服务器健康状况低于设定阈值断路器就会打开,请求会被禁止通过。当断路器处于打开状态时,一段时间后会进入半开状态,这时只允许一个请求通过,如果该请求成功熔断器恢复到关闭状态,如果调用失败断路器继续保持打开
服务降级
服务降级,一般是从整体符合考虑,就是当某个服务熔断之后,服务器将不再被调用,此刻客户端可以自己准备一个本地的fallback回调,返回一个缺省值

1.快速入门

(1)导入依赖spring-cloud-starter-hystrix
(2)消费启动类开启@EnableCircuitBreaker
(3)消费者配置yml文件feign.hystrix.enabled=true
(4)实现feiginclient接口

@Component
public class TestClient1FallBack implements TestClient1 {
    @Override
    public String get(String id) {
        return "feign hystrix fallback for get method";
    }
}

(5)@FeignClient注解配置fallback参数

@FeignClient(name="cleint-product", fallback = TestClient1FallBack.class)
public interface TestClient1 {
    @getmapping("/getProduct")
    public String get(String id) {}
}

八.配置中心 config

在SpringCloud中我们使用config组件来作为统一配置中心

1.搭建配置中心

(1)添加依赖
(2)配置文件 配置git信息

 spring.cloud.config.server.git.uri = https://github.com/xuwujing/springcloud-study/
 #git仓库下的相对地址
 spring.cloud.config.server.git.search-paths = springcloud-config/config-repo
 #拉取到本地的地址
 basedir: D:/config/basedir
 spring.cloud.config.server.git.username = 
 spring.cloud.config.server.git.password = 

(3)入口类添加@EnableConfigServer

2.配置中心访问方式

当文件命名遵循{application}-{profile}.properties ,可通过/{application}/{profile}访问

3.配置中心的调用

(1)加入config客户端依赖
(2)创建bootstrap.yml文件,它会优先于application.yml加载

spring:
  cloud:
    config:
      uri: http://127.1.1.1:9988 #配置中心地址
      name: conf #对应的application部分
      profile: dev  # 指定配置文件的环境 
      label: master #git的分支

4.springcloud config更新机制

git仓库文件发生改变。config客户端并不能直接感知(只有服务重启才可以感知)springcloud已经给我们提供了解决方案,每个客户端通过POST方法触发各自的/refresh
(1)添加依赖actuator
spring-boot-starter-actuator是一套监控的功能,可以监控程序在运行时状态,其中就包括/refresh的功能

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

(2)配置文件

#自动刷新配置 默认 health,info
management.endpoints.web.exposure.include=refresh

(3)访问/actuator/refresh(手动)
调用接口:http:127.0.0.1:1281/actuator/refresh
(想要自动访问可以使用webhook,push的时候自动访问接口)

5.config注册中心高可用

做集群,需要把config server也注册为服务,这样客户端就能以服务的形式进行访问。通过这种方法,启动多个指向同一git的config-server就能实现了
服务端改造:
(1)添加eureka客户端依赖
(2)配置文件增加以下内容,向eureka-server注册

eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8866/eureka/

(3)配置完全相同,改一下端口,启动3个
客户端改造
(1)bootstrap.yml在上面的基础上再增加:

spring:
  cloud:
    config:
      discovery:
          enable: true #开启config服务发现支持
          service-id: config-server #config服务端的服务名称
eureka:
   client:
      serviceUrl:
          defaultZone:http://127.0.0.1:8866/eureka/

九.API网关zuul

zuul是spring cloud中的微服务API网关。所有请求都会通过zuul到达指定服务。实现了认证和安全(验证只需要在网关,不需要在每个微服务),动态路由(这样前端请求网关就可以,避免服务路径改变对前端请求的影响)

1.zuul构建API网关

(1)添加zuul依赖
(2)在入口类添加@EnableZuulProxy注解
(3)配置文件配置注册中心
(4)访问zuul的id+端口+服务名称/方法
如果想改变路由规则,配置文件:

zuul.routes.springcloud-service=/abc/**

①如果什么规则都不写,就会有一套默认规则((4)中的格式)
②如果有某个规则不想被外部路由

zuul.ignored-services=service-provider

2.zuul 过滤器

Zuul大部分功能都是通过过滤器来实现的,Zuul定义了4种标准的过滤器类型,这些过滤器类型对应于请求的典型生命周期。
a、pre: 这种过滤器在请求被路由之前调用。可利用这种过滤器实现身份验证
b、routing: 这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求
c、post: 这种过滤器在路由到微服务以后执行。这种过滤器可用收集统计信息和指标等
d、error: 在其他阶段发送错误时执行该过滤器

public class DebugFilter extends ZuulFilter {

    //声明过滤器类型  
    @Override
    public String filterType() {
        return PRE_TYPE;
    }
    //过滤器执行顺序,数字越小,优先级越高
    @Override
    public int filterOrder() {
        return 0;
    }
    //该过滤器是否被执行
    @Override
    public boolean shouldFilter() {
        HttpServletRequest request = RequestContext.getCurrentContext().getRequest();
        if ("true".equals(request.getParameter(DEBUG_PARAMETER.get()))) {
            return true;
        }
        return ROUTING_DEBUG.get();
    }
    //过滤逻辑
    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();
        ctx.setDebugRouting(true);
        ctx.setDebugRequest(true);
        return null;
    }
}

十.sleuth 链路跟踪

调用一个服务,这个服务可能再请求其它服务,这样形成一条调用链,我们需要分析异常,就需要了解这条调用链。通过spring cloud-sleuth就能发现。可以结合ZipKin,利用ZipKin UI来展示数据
1.安装zipkin服务端
2.zipkin客户端(也就是被监控的服务)
(1)在需要跟踪的服务加zipkin和sleuth依赖
(2)配置文件

spring:
  sleuth:
      web:
        client:
            enable:true
      zipkin:
        base-url:http://127.0.0.1:9411/ #zipkin服务端地址
 
posted @ 2020-07-12 19:14  mu_阿成  阅读(160)  评论(0)    收藏  举报
// 侧边栏目录 // https://blog-static.cnblogs.com/files/douzujun/marvin.nav.my1502.css