一.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. 从四个问题透析Linux下C++编译&链接

    摘要:编译&链接对C&C++程序员既熟悉又陌生,熟悉在于每份代码都要经历编译&链接过程,陌生在于大部分人并不会刻意关注编译&链接的原理.本文通过开发过程中碰到的四个典型 ...

  2. 推荐一款轻量小众却高效免费开源windows热键脚本语言Autohotkey

    写在前面的话 Autohotkey是一款轻量小众但高效免费开源的windows热键脚本语言,游戏操纵.鼠标操作.键盘快捷重定义,快捷短语等等,只有你想不到,没有它做不到,神器中的神器呀,相见恨晚. 安 ...

  3. 小白也能看懂的ArrayList的扩容机制

    来,话不多说进入正题!我们下面用最简单的代码创建ArrayList并添加11个元素,并 一 一 讲解底层源码:在说之前,给大家先普及一些小知识: >ArrayList底层是用数组来实现的 > ...

  4. obj2opengl:转换OBJ 3D模型到iPhone OpenGL ES兼容的数组中

    原文如下:obj2opengl: convert obj 3D models to arrays compatible with iPhone OpenGL ES obj2opengl在GitHub中 ...

  5. 01 AS 首次编译执行项目过程中遇到的几个常见问题

    问题01 as打开时出现The environment variable JAVA_HOME (with The value of C:\Java\jdk1.8.0_101\bin) does not ...

  6. 06 C语言变量

    C语言变量 变量的本质 变量的本质其实是程序可操作的存储区的名称. C 中每个变量都有特定的类型,类型决定了变量存储的大小的范围,在范围内的值都可以存储在内存中,运算符可应用于变量上. 变量的名称可以 ...

  7. Metasploit简单使用——后渗透阶段

    在上文中我们复现了永恒之蓝漏洞,这里我们学习一下利用msf简单的后渗透阶段的知识/ 一.meterperter常用命令 sysinfo #查看目标主机系统信息 run scraper #查看目标主机详 ...

  8. ✅Vue选择图像

    下载 Vue选择图像Vue选择图像 Vue 2.用于从列表中选择图像的组件 演示 https://mazipan.github.io/vue-select-image/ 安装 #纱 纱添加vue-se ...

  9. 拉格朗日乘子法与KKT条件

    拉格朗日乘子法 \[min \quad f = 2x_1^2+3x_2^2+7x_3^2 \\s.t. \quad 2x_1+x_2 = 1 \\ \quad \quad \quad 2x_2+3x_ ...

  10. day19 Pyhton学习 递归函数

    # 函数的递归 : 在一个函数的内部调用它自己 # import sys # sys.setrecursionlimit(1000000) # 设置递归的最大深度 # 总结 # 1.递归函数的定义 : ...