本篇主要介绍的是SpringCloud相关知识、微服务架构以及搭建一个高可用的服务注册与发现的服务模块(Eureka)。java
Spring Cloud是在Spring Boot的基础上构建的,用于简化分布式系统构建的工具集,为开发人员提供快速创建分布式系统中的一些常见的模式。git
例如:github
配置管理(configuration management),服务发现(service discovery),断路器(circuit breakers),智能路由( intelligent routing),微代理(micro-proxy),控制总线(control bus),一次性令牌( one-time okens),全局锁(global locks),领导选举(leadership election),分布式会话(distributed sessions),集群状态(cluster state)等等。spring
微服务架构风格是一种将单个应用程序开发为一套小型服务的方法,每一个小型服务都在本身的流程中运行,并与轻量级机制(一般是HTTP资源API)进行通讯。这些服务围绕业务功能构建,可经过全自动部署机制独立部署。这些服务至少集中管理,能够用不一样的编程语言编写,并使用不一样的数据存储技术。编程
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现。也是springcloud体系中最重要最核心的组件之一。浏览器
Eureka主要由两个组件组成:Eureka服务器和Eureka客户端。 Eureka服务器用做服务注册服务器。 Eureka客户端是一个java客户端,用来简化与服务器的交互、做为轮询负载均衡器,并提供服务的故障切换支持。安全
开发环境bash
注:不必定非要用上述的版本,能够根据状况进行相应的调整。须要注意的是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>
复制代码
注: 基于SpringBoot1.x以上SpringCloud是Dalston版本的eureka 依赖是 <artifactId>spring-cloud-starter-eureka</artifactId>
,少了个 netflix 。SpringCloud的版本命名方式是经过伦敦的地方来命名的,版本顺序是根据首字母的顺序来的。
咱们先来实现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/
复制代码
配置说明:
完成配置信息的添加后,咱们再来看代码如何实现。 在服务端这边只须要在SpringBoot启动类添加@EnableEurekaServer
注解就能够了,该注解表示此服务是一个服务注册中心服务。
代码示例:
@EnableEurekaServer
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
System.out.println("注册中心服务启动...");
}
}
复制代码
这里咱们在新建一个客户端的项目,添加如上的依赖以后,在application.properties
添加以下的配置:
配置信息:
spring.application.name=springcloud-eureka-client
server.port=9001
eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
复制代码
配置说明:
服务端这边的实现也很简单,只需在启动类上添加@EnableDiscoveryClient
该注解便可,使用该注解表示该项目就具备了服务注册的功能。
代码示例:
@SpringBootApplication
@EnableDiscoveryClient
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
System.out.println("客户端服务启动...");
}
}
复制代码
完成如上的工程开发以后,咱们依次启动服务端和客户端程序,而后在浏览器界面输入: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自动进入自我保护机制,此时会出现如下几种状况:
所以Eureka Server能够很好的应对因网络故障致使部分节点失联的状况,而不会像ZK那样若是有一半不可用的状况会致使整个集群不可用而变成瘫痪。
自我保护机制的相关配置以下:
服务端的配置:
客户端的配置:
这里顺便说下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/
复制代码
server3配置信息:
spring.application.name=springcloud-eureka-server
server.port=8003
eureka.instance.hostname = server3
eureka.client.serviceUrl.defaultZone=http://server2:8002/eureka/
复制代码
上述的配置在以前已经说过了,这里就不在过多描述了。这里的服务端配置和以前项目的服务端配置略有不一样,容许本身进行注册了。而且这里的eureka.instance.hostname
至关因而对服务地址起一个别名,也能够不配置,默认将会使用IP进行查找。eureka.client.serviceUrl.defaultZone
这里配置的是另外一个服务端的地址,若是是多个就经过 ","逗号隔开。
由于这里使用了别名进行区分服务,因此须要在hosts文件添加以下配置,用于作映射。
127.0.0.1 server2
127.0.0.1 server3
复制代码
hosts文件地址:
Windows 系统地址:C:\Windows\System32\drivers\etc\hosts
Linux系统地址: /etc/hosts
配置完成以后,启动这两个服务,而后在浏览器输入: http://server2:8002/
或 http://server3:8003/
便可查看信息.
高可用注册中心示例图:
这里咱们把以前的客户端程序的配置改下,改为指定这个高可用注册中心的地址,而后在关闭其中一个服务,查看是否可以正常的使用。
示例图:
能够看到其中一个服务能够正常运行和使用!
基于SpringBoot1.x、SpringCloud的Dalston版本开发的地址:https://github.com/xuwujing/springcloud-study
。
基于SpringBoot1.x、SpringCloud 的Dalston版本开发的地址: https://github.com/xuwujing/springcloud-study-old
。
若是感受项目不错,但愿能给个star,谢谢!
挺有节奏感的一首纯音乐!
原创不易,若是感受不错,但愿给个推荐!您的支持是我写做的最大动力! 版权声明: 做者:虚无境 博客园出处:www.cnblogs.com/xuwujing CSDN出处:blog.csdn.net/qazwsxpcm 我的博客出处:www.panchengming.com