Spring Cloud系列(一):服务注册中心
一、Spring Cloud简介
Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线)。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式环境中运行良好,包括开发人员自己的笔记本电脑,裸机数据中心,以及Cloud Foundry等托管平台。
Spring Cloud需要基于Spring Boot项目来构建,而Spring Boot是在spring上封装了大量的注解和自动配置,增加了许多优秀的中间件的一个优秀的框架,如果不了解Spring Boot的使用,建议先去了解Spring Boot。
二、注册中心的介绍
在介绍注册中心之前先说一下单应用的架构。在单应用架构中,我们把所有的业务功能都放在了同一个项目中,如果有其中一个接口需要改动,那么就需要重新部署整个项目。当请求量大的时候,往往会在服务的前端增加一个负载均衡的组件,比如Nginx。这样,请求会先到达Nginx,再由Nginx把请求按照一定的策略分发给不同的节点(这里的一个节点就是一个tomcat服务),然后再处理返回结果。

在Spring Cloud这样的分布式架构中,我们会把服务进行拆分。比如说一个电商系统,我们可以粗略地把系统拆分为商品详情服务、订单服务、会员服务等等。这样,每个系统会有自己的数据库,只做自己的事。这时假如说一个用户想看一下订单详情,按道理说他需要请求订单系统的相关接口,但是订单详情应该显示这个订单的商品简略信息,比如商品名、商品缩略图等,但商品相关的信息应该是放在商品服务中的,这时候就需要一个地方,让商品服务把自己提供的服务放进去,让订单服务去调用,这个地方就是注册中心。

可以有多个服务提供者把自己提供的服务注册到注册中心,当服务消费者需要调用服务时,不用首先知道服务在哪里,而是直接去找注册中心就行了,从注册中心那里拿到所有可用的服务,然后自己再通过一定的策略来决定调用哪一个。另外,一个服务节点,既可以是服务提供者,也可以是服务消费者。
Spring Cloud支持的注册中心可以有多种,比如Eureka、Zookeeper、Consul等等。在这里我们使用Eureka作为我们的注册中心。
三、准备工作
我们使用IDEA作为开发工具,因为Spring Cloud是需要多个微服务协同工作的,在IDEA中,我们需要一个主项目(相当于Eclipse的一个Workspace),然后在主项目中每一个module(相当于Eclipse中的一个project)都是其中的一个服务。
3.1、创建一个Empty Project

然后填写好名称,完成后会弹出提供你创建module的对话框,先关闭。
3.2 创建Eureka模块作为服务注册中心
选择File->New->Module...,然后选择Spring Initializr。

然后填写好module的名称,接下来再选择相关的依赖——选择Spring Cloud Discovery下的Eureka Server依赖,Spring Boot的版本我们选择2.1.10,最后根据导向完成创建工作。创建好的module的pom文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.10.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.springcloud</groupId>
<artifactId>eureka</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>eureka</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.SR4</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
如果你使用的是没有Spring Initializr的IDEA Community版本,你也可以先创建一个maven的module,再到https://start.spring.io/选择Eureka,然后点击Explore-Ctrl + Space按钮,把相关的依赖复制到pom文件中。
3.3、配置eureka的参数
在application.properties文件中(如果习惯使用yml可以自行做调整)添加以下的配置
server.port=8761
spring.application.name=eureka
eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://${eureka.instance.hostname}:${server.port}/eureka/
事实上,eureka会把自身作为一个服务注册到自身当中,而eureka.client.register-with-eureka和eureka.client.fetch-registry这两个属性的值设置为false表明不需要把自己注册进去。
3.4、开启服务注册功能
在启动的主类上加上@EnableEurekaServer开启eureka服务功能
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication {
public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
到此注册中心微服务就完成了,可以启动了。
3.5、服务注册中心后台
启动成功后,在浏览器访问http://localhost:8761/,就可以看到Eureka的管理后台了,在这里我们可以看到向注册中心所注册的服务,目前我们还没有任何的服务注册,所以显示No instances available。

四、注册中心集群
我们的服务都需要注册到注册中心,如果只有一个节点,万一注册中心宕机了,整个系统就瘫痪了,注册中心作为服务的中枢,我们不能只用一个节点。如果有使用ZooKeeper的经验的人一定知道集群这个概念,这就是为了系统的高可用性而把数据切割成几个部分放到不同的节点中,就算有其中一个甚至几个节点出了问题,整个系统还是不受影响的。这里也介绍一下Eureka集群。
4.1、修改hosts文件
为了可以在windows上搭建集群,首先需要修改hosts文件,在hosts文件添加以下内容
127.0.0.1 eureka-1
127.0.0.1 eureka-2
127.0.0.1 eureka-3
4.2、修改配置文件
然后在resources目录下创建application-eureka1.properties、application-eureka2.properties、application-eureka3.properties
其中application-eureka1.properties的配置如下:
server.port=8761
spring.application.name=eureka
eureka.instance.hostname=eureka-1
eureka.client.register-with-eureka=true
eureka.client.fetch-registry=true
eureka.client.serviceUrl.defaultZone=http://eureka-2:8762/eureka/,http://eureka-3:8763/eureka/
节点1的端口是8761,主机名是eureka-1,那么defaultZone的值就配置另外两个节点的地址,地址用逗号分开;然后节点2的端口是8762,然后配置节点1和3的地址,以此类推。值得说明的是register-with-eureka和fetch-registry的值需要设置为true或者不配置(默认是true),因为搭建集群的时候需要把自己作为一个服务注册到注册中心,这样另外两个eureka服务才能发现它。
4.3、启动服务
点击启动配置下拉菜单,选择创建三个Spring Boot的启动配置,填写好名称、启动类和所用的配置文件:


填写好配置的名称(EurekaApplication-1)、选择启动类作为Main class,Active profile其实就是使用的配置文件,只需要写application-后面的那一段就行了。

然后如法炮制添加节点2和3。
到此集群方式的Eureka注册中心就完成了,如果上一步的单节点的应用还在运行的话先停止,不然会引起端口冲突。依次启动这三个节点,当启动第一个或者前两个时会报异常,这是因为我们的eureka集群是三个节点的,当第一个节点8761启动后,会去找8762和8763,但是此时另外两个节点还没启动,所以出现异常信息,这是正常的,当三个都启动成功后在浏览器访问http://eureka-1:8761/,也可以访问http://eureka-2:8762/或http://eureka-3:8763/,此时在eureka后台可以看到另外两个节点

图片下方Application这一项是根据配置文件中spring.application.name属性的值来显示的,就是应用的名称,因为我们把三个节点的名称都写成了一样,这里就会合并在一起显示,然后在Status中以各自的端口号区分,然后应用名不相同,就会分别显示。(但是同样的服务的服务名要写成一致)

另外我们需要注意一下后台下面的General Info的信息,如果其它两个节点可用,就会显示在available-replicas中,否则就会显示在unavailable-replicas中,这一点可以帮助我们检查注册中心的节点的健康状况。

五、总结
到此,eureka注册中心的使用就介绍完毕,下一篇介绍服务注册。
源码已经上传到github:https://github.com/spareyaya/spring-cloud-demo/tree/master/chapter1
Spring Cloud系列(一):服务注册中心的更多相关文章
- Spring Cloud 系列之 Consul 注册中心(二)
本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Consul 注册中心(一) 本篇文章讲解 Consul 集群环境的搭建. Consul 集群 上图是一个简单的 Co ...
- Spring Cloud 系列之 Consul 注册中心(一)
Netflix Eureka 2.X https://github.com/Netflix/eureka/wiki 官方宣告停止开发,但其实对国内的用户影响甚小,一方面国内大都使用的是 Eureka ...
- Spring Cloud 系列之 ZooKeeper 注册中心
什么是注册中心 服务注册中心是服务实现服务化管理的核心组件,类似于目录服务的作用,主要用来存储服务信息,譬如提供者 url 串.路由信息等.服务注册中心是微服务架构中最基础的设施之一. 注册中心可以说 ...
- Spring Cloud Alibaba | Nacos服务注册与发现
目录 Spring Cloud Alibaba | Nacos服务注册与发现 1. 服务提供者 1.1 pom.xml项目依赖 1.2 配置文件application.yml 1.3 启动类Produ ...
- Spring Cloud 系列之 Consul 配置中心
前面我们已经学习过 Spring Cloud Config 了: Spring Cloud 系列之 Config 配置中心(一) Spring Cloud 系列之 Config 配置中心(二) Spr ...
- Spring Cloud 系列之 Apollo 配置中心(二)
本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Apollo 配置中心(一) 本篇文章讲解 Apollo 部门管理.用户管理.配置管理.集群管理. 点击链接观看:Ap ...
- Spring Cloud 系列之 Apollo 配置中心(四)
本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Apollo 配置中心(一) Spring Cloud 系列之 Apollo 配置中心(二) Spring Clou ...
- spring cloud实战 1-高可用注册中心
创建父maven项目 提交代码至GitHub 创建eureka-server-1 项目搭建两种方式: 父pom中继承spring-boot-starter-parent,子pom中直接结成父pom.该 ...
- Spring Cloud 系列之 Config 配置中心(二)
本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Config 配置中心(一) 本篇文章讲解 Config 如何实现配置中心自动刷新. 配置中心自动刷新 点击链接观看: ...
- Spring Cloud 系列之 Config 配置中心(三)
本篇文章为系列文章,未读前几集的同学请猛戳这里: Spring Cloud 系列之 Config 配置中心(一) Spring Cloud 系列之 Config 配置中心(二) 本篇文章讲解 Conf ...
随机推荐
- Win64 驱动内核编程-28.枚举消息钩子
枚举消息钩子 简单粘贴点百度的解释,科普下消息钩子: 钩子是WINDOWS中消息处理机制的一个要点,通过安装各种钩子,应用程序能够设置相应的子例程来监视系统里的消息传递以及在这些消息到达目标窗口程序之 ...
- OGG-Oracle同步Sequence
一.需求,使用OGG同步软件,将Oracle 11g Sequence实时同步到19c新库中 参考文档 Implementing replication of cyclic sequences in ...
- sql常识-RIGHT JOIN
SQL RIGHT JOIN 关键字 RIGHT JOIN 关键字会右表 (table_name2) 那里返回所有的行,即使在左表 (table_name1) 中没有匹配的行. RIGHT JOIN ...
- 0902-用GAN生成动漫头像
0902-用GAN生成动漫头像 目录 一.概述 二.代码结构 三.model.py 3.1 生成器 3.2 判别器 四.参数配置 五.数据处理 六.训练 七.随机生成图片 八.训练模型并测试 pyto ...
- Java解析xml文件遇到特殊符号&会出现异常的解决方案
文/朱季谦 在一次Java解析xml文件的开发过程中,使用SAX解析时,出现了这样一个异常信息: Error on line 60 of document : 对实体 "xxx" ...
- c语言编程学习之字符串
字符串字面量与字符变量 1.字符串字面量 字符串字面量是一对双引号括起来的字符序列.当c语言编译器在程序中遇到长度为n的字符串字面量时,它会为字符串字面量分配长度为n+1的内存空间.这块内存空间用来存 ...
- C++ primer plus读书笔记——第6章 分支语句和逻辑运算符
第6章 分支语句和逻辑运算符 1. 逻辑运算符的优先级比关系运算符的优先级低. 2. &&的优先级高于||. 3. cctype中的函数P179. 4. switch(integer- ...
- /etc/ssh/sshd_config ssh自动断 cent7
vim /etc/ssh/sshd_config ClientAliveInterval 60ClientAliveCountMax 8630000 ClientAliveInterval 30Cli ...
- Ubuntu 20.04 搭建 LAMP 环境
LAMP环境即Linux下配置Apache.Mysql.Php,话不多说 GO ! 0.下载之前先更新一波: 更新源 sudo apt-get update 更新软件 sudo apt-get upg ...
- 058.Python前端Django与Ajax
一 Ajax简介 AJAX(Asynchronous Javascript And XML)翻译成中文就是"异步Javascript和XML".即使用Javascript语言与服务 ...