转自:https://blog.csdn.net/qazwsxpcm/article/details/80036519?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159332660519725247658205%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=159332660519725247658205&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_blog_v1-4-80036519.pc_v2_rank_blog_v1&utm_term=SpringCloud

前言

本篇主要介绍的是SpringCloud相关知识、微服务架构以及搭建一个高可用的服务注册与发现的服务模块(Eureka)。

SpringCloud介绍

Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集,为开发人员提供快速建立分布式系统中的一些常见的模式。

例如:

配置管理(configuration management),服务发现(service
discovery),断路器(circuit breakers),智能路由( intelligent routing),微代理(micro-proxy),控制总线(control bus),一次性令牌( one-time okens),全局锁(global locks),领导选举(leadership election),分布式会话(distributed sessions),集群状态(cluster state)等等。

微服务架构是什么

微服务架构风格是一种将单个应用程序开发为一套小型服务的方法,每个小型服务都在自己的流程中运行,并与轻量级机制(通常是HTTP资源API)进行通信。这些服务围绕业务功能构建,可通过全自动部署机制独立部署。这些服务至少集中管理,可以用不同的编程语言编写,并使用不同的数据存储技术。

SpringCloud Eureka

Eureka 介绍

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

Eureka主要由两个组件组成:Eureka服务器和Eureka客户端。
Eureka服务器用作服务注册服务器。
Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。

开发准备

开发环境

  • JDK:1.8
  • SpringBoot:2.1.1.RELEASE
  • SpringCloud:Finchley

注:不一定非要用上述的版本,可以根据情况进行相应的调整。需要注意的是SpringBoot2.x以后,jdk的版本必须是1.8以上!

确认了开发环境之后,我们再来添加相关的pom依赖。

<dependencies>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-netflix-eureka</artifactId>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-test</artifactId>
		<scope>test</scope>
	</dependency>
</dependencies>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

注: 基于SpringBoot1.x以上SpringCloud是Dalston版本的eureka 依赖是 <artifactId>spring-cloud-starter-eureka</artifactId>,少了个 netflix 。SpringCloud的版本命名方式是通过伦敦的地方来命名的,版本顺序是根据首字母的顺序来的。

SpringCloud Eureka Hello World

我们先来实现Eureka的Hello World版,其实也就是实现简单的服务注册和发现功能。

服务端

首先建立一个服务端的工程,添加如上的依赖之后,在application.properties添加如下的配置:

配置信息:

spring.application.name=springcloud-eureka-client
server.port=8000
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
  • 1
  • 2
  • 3
  • 4
  • 5

配置说明:

  • spring.application.name: 这个是指定服务名称。
  • server.port:服务指定的端口。
  • eureka.client.register-with-eureka:表示是否将自己注册到Eureka Server,默认是true。
  • eureka.client.fetch-registry:表示是否从Eureka Server获取注册信息,默认为true。
  • eureka.client.serviceUrl.defaultZone: 这个是设置与Eureka Server交互的地址,客户端的查询服务和注册服务都需要依赖这个地址。

完成配置信息的添加后,我们再来看代码如何实现。
在服务端这边只需要在SpringBoot启动类添加@EnableEurekaServer注解就可以了,该注解表示此服务是一个服务注册中心服务。

代码示例:

	@EnableEurekaServer
	@SpringBootApplication
	public class App {
	  public static void main(String[] args) {
	      SpringApplication.run(App.class, args);
	      System.out.println("注册中心服务启动...");
	  }
	}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

客户端

这里我们在新建一个客户端的项目,添加如上的依赖之后,在application.properties添加如下的配置:

配置信息:

spring.application.name=springcloud-eureka-client
server.port=9001
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
  • 1
  • 2
  • 3

配置说明:

  • spring.application.name: 这个是客户端的服务名称。如果有多个服务使用同一个名称但是访问地址不同,结合ribbon 使用,则可以实现负载均衡功能。
  • server.port:服务指定的端口。
  • eureka.client.serviceUrl.defaultZone: 注册中心服务端的地址。

服务端这边的实现也很简单,只需在启动类上添加@EnableDiscoveryClient该注解即可,使用该注解表示该项目就具有了服务注册的功能。

代码示例:

	@SpringBootApplication
	@EnableDiscoveryClient
	public class App {
	
		public static void main(String[] args) {
			SpringApplication.run(App.class, args);
			System.out.println("客户端服务启动...");
		}
	}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

功能测试

完成如上的工程开发之后,我们依次启动服务端和客户端程序,然后在浏览器界面输入:http://localhost:8000/,即可查看注册中心的信息。

访问界面地址:

在这里插入图片描述

通过上述示例图中,可以看到Eureka启动成功了,并且有一个服务进行注册了。

成功的实现了服务注册功能之后,我们来测试下Eureka服务的保护机制。
这里我们先关闭客户端,查看界面信息,发现没什么改变,等待大约15分钟左右之后,再到Eureka界面查看信息,发现出现了一长串红字描述,描述的语句如下:

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.

翻译之后的意思:

紧急!EUREKA可能错误地声称实例已经启动,而实际上并没有。续订小于阈值,因此实例不会为了安全而过期。

界面示例图:

在这里插入图片描述

这里就顺便说下Eureka的自我保护机制。

自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。

自我保护机制的工作机制是如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,此时会出现以下几种情况:

  1. Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
  2. Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
  3. 当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。

因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,而不会像ZK那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。

自我保护机制的相关配置如下:

服务端的配置:

  • eureka.server.enable-self-preservation: 该配置可以移除这种自我保护机制,防止失效的服务也被一直访问 (Spring Cloud默认该配置是 true)。
  • eureka.server.eviction-interval-timer-in-ms:该配置可以修改检查失效服务的时间,每隔10s检查失效服务,并移除列表 (Spring Cloud默认该配置是 60s)

客户端的配置:

  • eureka.instance.lease-renewal-interval-in-seconds: 该配置指示eureka客户端需要向eureka服务器发送心跳的频率 (Spring Cloud默认该配置是 30s)。
  • eureka.instance.lease-expiration-duration-in-seconds: 该配置指示eureka服务器在接收到最后一个心跳之后等待的时间,然后才能从列表中删除此实例 (Spring Cloud默认该配置是 90s)。

这里顺便说下Eureka的的心跳机制。

Eureka Client需要每30秒给Eureka Server发一次心跳,同时更新Server上最新的注册信息到本地,如果Server多次没有收到来自客户端的心跳,那么在90秒内会被Server上剔除。

高可用的注册中心

上述的服务注册中心示例是单点的,如果在生产环境中就显得不适合,显然这并不适合应用于线上生产环境。作为分布式系统最重要的注册服务功能,为了使其高可用,使用集群是最普遍的方式。Eureka可以通过互相注册的方式来实现高可用的部署。

Eureka实现相互注册的方式很简单,只需要将各个服务端的地址相互进行配置即可。
那么我们再来新建两个服务端的工程,其中配置信息如下:

server2配置信息:

spring.application.name=springcloud-eureka-server
server.port=8002
eureka.instance.hostname = server2
eureka.client.serviceUrl.defaultZone=http://server3:8003/eureka/
  • 1
  • 2
  • 3
  • 4

server3配置信息:

spring.application.name=springcloud-eureka-server
server.port=8003
eureka.instance.hostname = server3
eureka.client.serviceUrl.defaultZone=http://server2:8002/eureka/
  • 1
  • 2
  • 3
  • 4

上述的配置在之前已经说过了,这里就不在过多描述了。这里的服务端配置和之前项目的服务端配置略有不同,允许自己进行注册了。并且这里的eureka.instance.hostname相当于是对服务地址起一个别名,也可以不配置,默认将会使用IP进行查找。eureka.client.serviceUrl.defaultZone这里配置的是另一个服务端的地址,如果是多个就通过 ","逗号隔开。

因为这里使用了别名进行区分服务,所以需要在hosts文件添加如下配置,用于做映射。

127.0.0.1     server2
127.0.0.1     server3
  • 1
  • 2

hosts文件地址:

Windows 系统地址:C:\Windows\System32\drivers\etc\hosts

Linux系统地址: /etc/hosts

配置完成之后,启动这两个服务,然后在浏览器输入:
http://server2:8002/

http://server3:8003/
即可查看信息.

高可用注册中心示例图:

在这里插入图片描述

这里我们把之前的客户端程序的配置改下,改成指定这个高可用注册中心的地址,然后在关闭其中一个服务,查看是否能够正常的使用。

示例图:

在这里插入图片描述

可以看到其中一个服务可以正常运行和使用!

其他

项目地址

基于SpringBoot2.x、SpringCloud的Finchley版本开发的地址:https://github.com/xuwujing/springcloud-study

基于SpringBoot1.x、SpringCloud 的Dalston版本开发的地址: https://github.com/xuwujing/springcloud-study-old

如果感觉项目不错,希望能给个star,谢谢!

音乐推荐

挺有节奏感的一首纯音乐!

border="0" width="330" height="86" src="//music.163.com/outchain/player?type=2&id=730859&auto=0&height=66">

原创不易,如果感觉不错,希望给个推荐!您的支持是我写作的最大动力!

posted on 2020-09-22 16:02  Sharpest  阅读(165)  评论(0编辑  收藏  举报