一.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服务端地址

【总结】springcloud的更多相关文章

  1. 【微框架】之一:从零开始,轻松搞定SpringCloud微框架系列--开山篇(spring boot 小demo)

    Spring顶级框架有众多,那么接下的篇幅,我将重点讲解SpringCloud微框架的实现 Spring 顶级项目,包含众多,我们重点学习一下,SpringCloud项目以及SpringBoot项目 ...

  2. springcloud(第三篇)springcloud eureka 服务注册与发现 *****

    http://blog.csdn.net/liaokailin/article/details/51314001 ******************************************* ...

  3. SpringCloud Sleuth 使用

    1. 介绍   Spring-Cloud-Sleuth是Spring Cloud的组成部分之一,为SpringCloud应用实现了一种分布式追踪解决方案,其兼容了Zipkin, HTrace和log- ...

  4. SpringCloud+Consul 服务注册与服务发现

    SpringCloud+Consul 服务注册与服务发现 1. 服务注册: 在Spring.factories有一段: # Discovery Client Configuration org.spr ...

  5. SpringCloud学习后获取的地址

    关于SpringCloud + Docker 学习地址: (1) https://yq.aliyun.com/articles/57265 (2) https://yq.aliyun.com/team ...

  6. SpringCloud网关ZUUL集成consul

    最近一直在搞基于springcloud的微服务开发,为了不限定微服务开发语言,服务发现决定采用consul不多说上代码 pom文件 <project xmlns="http://mav ...

  7. springcloud(一):大话Spring Cloud

    研究了一段时间spring boot了准备向spirng cloud进发,公司架构和项目也全面拥抱了Spring Cloud.在使用了一段时间后发现Spring Cloud从技术架构上降低了对大型系统 ...

  8. springcloud(二):注册中心Eureka

    Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...

  9. springcloud(四):熔断器Hystrix

    说起springcloud熔断让我想起了去年股市中的熔断,多次痛的领悟,随意实施的熔断对整个系统的影响是灾难性的,好了接下来我们还是说正事. 熔断器 雪崩效应 在微服务架构中通常会有多个服务层调用,基 ...

  10. springcloud(六):配置中心(一)

    随着线上项目变的日益庞大,每个项目都散落着各种配置文件,如果采用分布式的开发模式,需要的配置文件随着服务增加而不断增多.某一个基础服务信息变更,都会引起一系列的更新和重启,运维苦不堪言也容易出错.配置 ...

随机推荐

  1. Windows下设置Mongodb用户名密码

    MongoDB认证: 在默认的情况下,Mongodb是监听在127.0.0.1 IP上的,端口号默认为27017,任何客户端都可以连接,不需要认证 默认情况下,Mongodb也是没有管理账户的,除非你 ...

  2. 一款Java开源的Springboot即时通讯 IM,附源码

    # 开篇 电商平台最不能缺的就是即时通讯,例如通知类下发,客服聊天等.今天,就来给大家分享一个开源的即时通讯系统.如对文章不感兴趣可直接跳至文章末尾,有获取源码链接的方法. 但文章内容是需要你简单的过 ...

  3. Python对象的空间边界:独善其身与开放包容

    导读:Python猫是一只喵星来客,它爱地球的一切,特别爱优雅而无所不能的 Python.我是它的人类朋友豌豆花下猫,被授权润色与发表它的文章.如果你是第一次看到这个系列文章,那我强烈建议,请先看看它 ...

  4. 你来讲讲AQS是什么吧?都是怎么用的?

    前言 在Java面试的时候,多线程相关的知识是躲不掉的,肯定会被问.我就被问到了AQS的知识,就直接了当的问,AQS知道是什么吧,来讲讲它是怎么实现的,以及哪些地方用到了它.当时自己确实没有讲好,所以 ...

  5. python下正则表达式的随笔记录

    使用了下正则的表达式: 目的:取出字符串中{}中的内容 最后使用的正则表达式为 {(.*?)} 先看   .*?  : 首先  .  是用来匹配字符串,但是只能匹配一次. 所以加上  *  ,可以让 ...

  6. 联赛模拟测试8 Dash Speed 线段树分治

    题目描述 分析 对于测试点\(1\).\(2\),直接搜索即可 对于测试点\(3 \sim 6\),树退化成一条链,我们可以将其看成序列上的染色问题,用线段树维护颜色相同的最长序列 对于测试点\(7\ ...

  7. Jetson AGX Xavier/ubuntu查找文件

    用以下命令查找文件 sudo updatedb locate xxx #xxx是文件名 如果找不到命令,则需要安装mlocate sudo apt-get install mlocate

  8. 二进制搭建kubernetes-1.18.6单master集群

    master组件 kube-apiserver kubernetes API集群的同一入口,各组件协调者,以RESTful API提供接口服务,所有对象资源的增删改查和监听操作都交给APIserver ...

  9. 从字节码层次看i++和++i

    关于的Java的i++和++i的区别,初学者可能会混淆,这时候有经验的同学或同事就会告诉你,++在后,就会立马加值, ++在后则会等会儿再加,所以如果i == 0 ,那么i++ == 0,++i == ...

  10. ls: 显示目下的内容及相关属性信息

    ls: 显示目下的内容及相关属性信息 [功能说明] ls 命令可以理解为英文单词 "list" 的缩写,其功能是列出目录的内容及其内容属性信息(list directory con ...