Spring Cloud | Note-5

Spring Cloud微服务 | Note(5)

@2018年8月7日 11:20:19

微服务协调者 Spring Cloud

简介

构建一整套完整的分布式系统的框架;解决微服务的问题;解决配置管理;服务注册;服务发现(不同服务之间互相发现,通过服务中心发现与调用);断路器(保护系统,过载过大);智能路由;微代理;服务间调用;一次性令牌;思维导图模版;全局锁;控制总线;领导选举;分布式会话;集群状态;分布式消息

Spring Cloud 与 Spring Boot关系

Spring Boot是构建Spring Cloud架构的基石;

每个子项目都可看做一个Spring Boot项目;

Spring Cloud 版本命名规则(伦敦地铁站命名);

Finchley版本基于Spring Boot2.0.x;

入门配置、子项目介绍

Spring Cloud Config :配置中心,利用git集中管理程序的配置

Spring Cloud Netflix:集成Netflix的开源软件(Eureka、Hystrix、Zuul、Archaius)

Spring Cloud Bus:消息总线,利用分布式消息将服务和服务实例连接在一起,用于在一个集群中传播状态的变化(配置更改的实现,用与Config联合实现热部署)

Spring Cloud for Cloud Foundry:略

Spring Cloud Cluster:基于Zookeeper、Redis、Hazelacast、Consul实现的领导选举和平民状态模式的抽象和实现

Spring Cloud Consul:分布式协调软件,基于Hashicorp Consul实现服务的发现和配置管理

Spring Cloud Security:在Zuul代理中为OAuth2 REST客户端和认证头转发提供负载均衡

Spring Cloud Sleuth:用于程序的分布式跟踪、基于日志(ELK)的跟踪相兼容,可以日志的收集

Spring Cloud Data Flow:针对现代运行时可组合的微服务程序的云本地编排服务

Spring Cloud Stream:轻量级的事件驱动的微服务框架构建连接到外部系统的程序

Spring Cloud Stream App Starters:基于Spring Boot为外部系统提供Spring的集成

Spring Cloud Task App Starters:Spring Boot应用程序,可能是任何进程,包括Spring Batch作业,并可以在数据处理有限的时间终止

Spring Cloud Contract:一个总体项目,包含帮助用户成功实施消费者驱动契约的解决方案


微服务的注册与发现

服务发现的意义

发布的服务,让其他的服务可以使用发现(例:域名DNS系统);

发现服务的方法:

通过URI访问服务 弊端:绑定主机、难记、难以负载均衡;

使用Eureka:提供服务注册与发现;与Spring Cloud无缝集成;高可用性;开源;


集成Eureka Server

环境:Spring Boot 2.0.3 RELEASE,Spring Cloud Starters Netflix Eureka Server Finchley.SR1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// build.gradle
buildscript {
ext {
springBootVersion = '2.0.3.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
ext {
springCloudVersion = 'Finchley.SR1'
}

dependencies {
// Eureka Server
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-server')
testCompile('org.springframework.boot:spring-boot-starter-test')
}

dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// application.properties
# Eureka
server.port=8761
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/

// Application.java
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}

集成Eureka Client

环境:Spring Boot 2.0.3 RELEASE,Spring Cloud Starters Netflix Eureka Server Finchley.SR1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// build.gradle
buildscript {
ext {
springBootVersion = '2.0.3.RELEASE'
}
repositories {
mavenCentral()
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
ext {
springCloudVersion = 'Finchley.SR1'
}

dependencies {
// Eureka Server
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
testCompile('org.springframework.boot:spring-boot-starter-test')
}

dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
// application.properties
# eureka client
spring.application.name=micro-weather-eureka-client
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

// Application.java
@SpringBootApplication
@EnableEurekaClient
public class MicroWeatherEurekaClientApplication {
public static void main(String[] args) {
SpringApplication.run(MicroWeatherEurekaClientApplication.class, args);
}
}

模拟服务关闭后,Server出现:

EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY’RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.

证明Server开启保护模式:保持一个时间段(15分钟),服务是否进行暂停,可能是由于网络问题不稳定而不是服务的暂停,进行一个防护机制,减少误判。


实现服务的注册与发现

将四个微服务进行改造,集成到Eureka Server & Cilent中

环境:Redis,Spring Boot 2.0.3 RELEASE,Spring Cloud Starters Netflix Eureka Server Finchley.SR1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 对四个微服务的build.gradle 配置文件进行修改
// 添加如下配置,类eureka client
buildscript {
ext {
springBootVersion = '2.0.3.RELEASE'
}
...
}
...
ext {
springCloudVersion = 'Finchley.SR1'
}

dependencies {
...
// Eureka Client
compile('org.springframework.cloud:spring-cloud-starter-netflix-eureka-client')
}

dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
// 四个微服务的Application.java文件进行修改
@SpringBootApplication
@EnableDiscoveryClient
public class ...Application {
public static void main(String[] args) {
SpringApplication.run(...Application.class, args);
}
}
// 四个微服务的application.properties
# ... eureka server
server.pory=808x
spring.application.name=micro-weather-...-eureka
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

附录

URI:

URI:统一资源标志符(Uniform Resource Identifier)
URL:统一资源定位符(Uniform Resource Location)

URI与URL都是定位资源位置的,就是表示这个资源的位置信息。

URI是一种宽泛的含义更广的定义,而URL则是URI的一个子集,就是说URL是URI的一部分。

换言之,每个URL都是URI,但是不是每个URI都是URL的。他们之间最明显的不同就是在java.net.URI你只能看到他的一些属性,他只是表示一个位置,但是你没有办法通过URI获取到这个对象的流,但是URL就不同了。java.net.URL该类提供方法(openConnection()),通过该方法我们可以通过IO流操作。

也就是说:URL可以直接操作的,但是URI不可以。

负载均衡:

当一台服务器的性能达到极限时,可以使用服务器集群来提高网站的整体性能。那么,在服务器集群中,需要有一台服务器充当调度者的角色,用户的所有请求都会首先由它接收,调度者再根据每台服务器的负载情况将请求分配给某一台后端服务器去处理。

在这个过程中,调度者如何合理分配任务,保证所有后端服务器都将性能充分发挥,从而保持服务器集群的整体性能最优,这就是负载均衡问题。

@ 2018年8月7日 16:09:19