Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)【Dalston版】

已经有非常长的时间没有更新《Spring Cloud构建微服务架构》系列文章了,自从开始写Spring Cloud的专题内容开始就获得了不少的阅读量和认可,当然也有一些批评,其中也不乏一些很中肯的意见和深度的问题,对我来说也是进一步提高的契机,在此感谢所有关注我博客的读者们。

由于之前主要精力都花在的编写《Spring Cloud微服务实战》一书上,所以该系列文章就没有得到持续的维护和更新。由于漫长的写书过程和繁琐的出版流程,在本书一面世的时候,在版本上已经落后于当前的最新版本。虽然在书中前前后后加入了一些版本更新的注意事项,但是认识过程不是一蹴而就的,总是随着实践的深入慢慢发现的。所以,决定重写一下该系列文章,一方面将Spring Cloud的版本更新到Dalston,另一方面重新组织内容并增加一些之前没有写过的重要组件。希望通过这个系列,来帮助准备使用Spring Cloud的朋友们快速入门。同时,也是作为《Spring Cloud微服务实战》一书对最新版本做一些不同内容的补充。

Spring Cloud简介

Spring Cloud是一个基于Spring Boot实现的云应用开发工具,它为基于JVM的云应用开发中涉及的配置管理、服务发现、断路器、智能路由、微代理、控制总线、全局锁、决策竞选、分布式会话和集群状态管理等操作提供了一种简单的开发方式。

Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring Cloud Commons、Spring Cloud Zookeeper、Spring Cloud CLI等项目。

微服务架构

“微服务架构”在这几年非常的火热,以至于关于微服务架构相关的开源产品被反复的提及(比如:netflix、dubbo),Spring Cloud也因Spring社区的强大知名度和影响力也被广大架构师与开发者备受关注。

那么什么是“微服务架构”呢?简单的说,微服务架构就是将一个完整的应用从数据存储开始垂直拆分成多个不同的服务,每个服务都能独立部署、独立维护、独立扩展,服务与服务间通过诸如RESTful API的方式互相调用。

对于“微服务架构”,大家在互联网可以搜索到很多相关的介绍和研究文章来进行学习和了解。也可以阅读始祖Martin Fowler的《Microservices》(中文版翻译点击查看),本文不做更多的介绍和描述。

服务治理

在简单介绍了Spring Cloud和微服务架构之后,下面回归本文的主旨内容,如何使用Spring Cloud来实现服务治理。

由于Spring Cloud为服务治理做了一层抽象接口,所以在Spring Cloud应用中可以支持多种不同的服务治理框架,比如:Netflix Eureka、Consul、Zookeeper。在Spring Cloud服务治理抽象层的作用下,我们可以无缝地切换服务治理实现,并且不影响任何其他的服务注册、服务发现、服务调用等逻辑。

所以,下面我们通过介绍两种服务治理的实现来体会Spring Cloud这一层抽象所带来的好处。

Spring Cloud Eureka

首先,我们来尝试使用Spring Cloud Eureka来实现服务治理。

Spring Cloud Eureka是Spring Cloud Netflix项目下的服务治理模块。而Spring Cloud Netflix项目是Spring Cloud的子项目之一,主要内容是对Netflix公司一系列开源产品的包装,它为Spring Boot应用提供了自配置的Netflix OSS整合。通过一些简单的注解,开发者就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。它主要提供的模块包括:服务发现(Eureka),断路器(Hystrix),智能路由(Zuul),客户端负载均衡(Ribbon)等。

下面,就来具体看看如何使用Spring Cloud Eureka实现服务治理。

创建“服务注册中心”

创建一个基础的Spring Boot工程,命名为eureka-server,并在pom.xml中引入需要的依赖内容:

<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/>
</parent>

<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>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

通过@EnableEurekaServer注解启动一个服务注册中心提供给其他应用进行对话。这一步非常的简单,只需要在一个普通的Spring Boot应用中添加这个注解就能开启此功能,比如下面的例子:

@EnableEurekaServer
@SpringBootApplication
public class Application {

public static void main(String[] args) {
new SpringApplicationBuilder(Application.class)
.web(true).run(args);
}
}

在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,只需要在application.properties配置文件中增加如下信息:

spring.application.name=eureka-server
server.port=1001

eureka.instance.hostname=localhost
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false

为了与后续要进行注册的服务区分,这里将服务注册中心的端口通过server.port属性设置为1001。启动工程后,访问:http://localhost:1001/,可以看到下面的页面,其中还没有发现任何服务。

创建“服务提供方”

下面我们创建提供服务的客户端,并向服务注册中心注册自己。本文我们主要介绍服务的注册与发现,所以我们不妨在服务提供方中尝试着提供一个接口来获取当前所有的服务信息。

首先,创建一个基本的Spring Boot应用。命名为eureka-client,在pom.xml中,加入如下配置:

<parent> 
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>

<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>

<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

其次,实现/dc请求处理接口,通过DiscoveryClient对象,在日志中打印出服务实例的相关内容。

@RestController
public class DcController {

@Autowired
DiscoveryClient discoveryClient;

@GetMapping("/dc")
public String dc() {
String services = "Services: " + discoveryClient.getServices();
System.out.println(services);
return services;
}

}

最后在应用主类中通过加上@EnableDiscoveryClient注解,该注解能激活Eureka中的DiscoveryClient实现,这样才能实现Controller中对服务信息的输出。

@EnableDiscoveryClient
@SpringBootApplication
public class Application {
public static void main(String[] args) {
new SpringApplicationBuilder(
ComputeServiceApplication.class)
.web(true).run(args);
}
}

我们在完成了服务内容的实现之后,再继续对application.properties做一些配置工作,具体如下:

spring.application.name=eureka-client
server.port=2001
eureka.client.serviceUrl.defaultZone=http://localhost:1001/eureka/

通过spring.application.name属性,我们可以指定微服务的名称后续在调用的时候只需要使用该名称就可以进行服务的访问。eureka.client.serviceUrl.defaultZone属性对应服务注册中心的配置内容,指定服务注册中心的位置。为了在本机上测试区分服务提供方和服务注册中心,使用server.port属性设置不同的端口。

启动该工程后,再次访问:http://localhost:1001/。可以如下图内容,我们定义的服务被成功注册了。

当然,我们也可以通过直接访问eureka-client服务提供的/dc接口来获取当前的服务清单,只需要访问:http://localhost:2001/dc,我们可以得到如下输出返回:

Services: [eureka-client]

其中,方括号中的eureka-client就是通过Spring Cloud定义的DiscoveryClient接口在eureka的实现中获取到的所有服务清单。由于Spring Cloud在服务发现这一层做了非常好的抽象,所以,对于上面的程序,我们可以无缝的从eureka的服务治理体系切换到consul的服务治理体系中区。

Spring Cloud Consul

Spring Cloud Consul项目是针对Consul的服务治理实现。Consul是一个分布式高可用的系统,它包含多个组件,但是作为一个整体,在微服务架构中为我们的基础设施提供服务发现和服务配置的工具。它包含了下面几个特性:

  • 服务发现
  • 健康检查
  • Key/Value存储
  • 多数据中心

由于Spring Cloud Consul项目的实现,我们可以轻松的将基于Spring Boot的微服务应用注册到Consul上,并通过此实现微服务架构中的服务治理。

以之前实现的基于Eureka的示例(eureka-client)为基础,我们如何将之前实现的服务提供者注册到Consul上呢?方法非常简单,我们只需要在pom.xml中将eureka的依赖修改为如下依赖:

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-consul-discovery</artifactId>
</dependency>

接下来再修改一下application.properites,将consul需要的配置信息加入即可,比如:(下面配置是默认值)

spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500

到此为止,我们将eureka-client转换为基于consul服务治理的服务提供者就完成了。前文我们已经有提到过服务发现的接口DiscoveryClient是Spring Cloud对服务治理做的一层抽象,所以可以屏蔽Eureka和Consul服务治理的实现细节,我们的程序不需要做任何改变,只需要引入不同的服务治理依赖,并配置相关的配置属性就能轻松的将微服务纳入Spring Cloud的各个服务治理框架中。

下面可以尝试让consul的服务提供者运行起来。这里可能读者会问,不需要创建类似eureka-server的服务端吗?由于Consul自身提供了服务端,所以我们不需要像之前实现Eureka的时候创建服务注册中心,直接通过下载consul的服务端程序就可以使用。

我们可以用下面的命令启动consul的开发模式:

$consul agent -dev
==> Starting Consul agent...
==> Starting Consul agent RPC...
==> Consul agent running!
Version: 'v0.7.2'
Node name: 'Lenovo-zhaiyc'
Datacenter: 'dc1'
Server: true (bootstrap: false)
Client Addr: 127.0.0.1 (HTTP: 8500, HTTPS: -1, DNS: 8600, RPC: 8400)
Cluster Addr: 127.0.0.1 (LAN: 8301, WAN: 8302)
Gossip encrypt: false, RPC-TLS: false, TLS-Incoming: false
Atlas: <disabled>

==> Log data will now stream in as it occurs:

2017/06/22 07:50:54 [INFO] raft: Initial configuration (index=1): [{Suffrage:Voter ID:127.0.0.1:8300 Address:127.0.0.1:8300}]
2017/06/22 07:50:54 [INFO] raft: Node at 127.0.0.1:8300 [Follower] entering Follower state (Leader: "")
2017/06/22 07:50:54 [INFO] serf: EventMemberJoin: Lenovo-zhaiyc 127.0.0.1
2017/06/22 07:50:54 [INFO] consul: Adding LAN server Lenovo-zhaiyc (Addr: tcp/127.0.0.1:8300) (DC: dc1)
2017/06/22 07:50:54 [INFO] serf: EventMemberJoin: Lenovo-zhaiyc.dc1 127.0.0.1
2017/06/22 07:50:54 [INFO] consul: Adding WAN server Lenovo-zhaiyc.dc1 (Addr: tcp/127.0.0.1:8300) (DC: dc1)
2017/06/22 07:51:01 [ERR] agent: failed to sync remote state: No cluster leader
2017/06/22 07:51:02 [WARN] raft: Heartbeat timeout from "" reached, starting election
2017/06/22 07:51:02 [INFO] raft: Node at 127.0.0.1:8300 [Candidate] entering Candidate state in term 2
2017/06/22 07:51:02 [DEBUG] raft: Votes needed: 1
2017/06/22 07:51:02 [DEBUG] raft: Vote granted from 127.0.0.1:8300 in term 2. Tally: 1
2017/06/22 07:51:02 [INFO] raft: Election won. Tally: 1
2017/06/22 07:51:02 [INFO] raft: Node at 127.0.0.1:8300 [Leader] entering Leader state
2017/06/22 07:51:02 [INFO] consul: cluster leadership acquired
2017/06/22 07:51:02 [INFO] consul: New leader elected: Lenovo-zhaiyc
2017/06/22 07:51:02 [DEBUG] consul: reset tombstone GC to index 3
2017/06/22 07:51:02 [INFO] consul: member 'Lenovo-zhaiyc' joined, marking health alive
2017/06/22 07:51:02 [INFO] agent: Synced service 'consul'
2017/06/22 07:51:02 [DEBUG] agent: Node info in sync

consul服务端启动完成之后,我们再将之前改造后的consul服务提供者启动起来。consul与eureka一样,都提供了简单的ui界面来查看服务的注册情况:

更多关于Consul的使用指南,读者可查看官方文档:https://www.consul.io/

更多Spring Cloud内容请持续关注我的博客更新或在《Spring Cloud微服务实战》中获取。

代码示例

样例工程将沿用之前在码云和GitHub上创建的SpringCloud-Learning项目,重新做了一下整理。通过不同目录来区分Brixton和Dalston的示例。

  • 码云:点击查看
  • GitHub:点击查看

具体工程说明如下:

  • eureka的服务注册中心:eureka-server
  • eureka的服务提供方:eureka-client
  • consul的服务提供方:consul-client

相关阅读

  • eureka的高可用服务注册中心
  • eureka源码分析
  • 基于consul的分布式锁
  • 基于consul的分布式信号量
  • Spring Cloud构建微服务架构:服务注册与发现(Eureka、Consul)
  • Spring Cloud构建微服务架构:服务消费者(基础)
  • Spring Cloud构建微服务架构:服务消费者(Ribbon)
  • Spring Cloud构建微服务架构:服务消费者(Feign)
  • Spring Cloud构建微服务架构:分布式配置中心
  • Spring Cloud构建微服务架构:服务容错保护(hystrix服务降级)
  • Spring Cloud构建微服务架构:服务容错保护(hystrix依赖隔离)
  • Spring Cloud构建微服务架构:服务容错保护(hystrix断路器)
  • Spring Cloud构建微服务架构:Hystrix监控面板
  • Spring Cloud构建微服务架构:Hystrix监控数据聚合
  • 更多Spring Cloud内容…

money.jpg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/477485.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

虚拟专辑丨知识图谱

虚 拟 专 辑 “武大学术期刊”的“虚拟专辑” 旨在将已发表在武汉大学科技期刊中心旗下期刊的论文以时下热点领域按主题重新组合&#xff0c;集中推送&#xff0c;以方便不同专业领域的读者集中查阅、追踪最新研究成果。此次推送的“知识图谱”虚拟专辑&#xff0c;为近几年发…

prompt你到底行不行?

文 | 马杀鸡三明治 源 | 知乎 很久之前老板下任务要试试prompt这个大风&#xff0c;但是玩完后发现太菜了所以连文章都没写&#xff0c;刚好今天工作比较闲就来写写了。 先上结论&#xff0c;连续prompt为运用大模型提供了一种思路&#xff0c;其实这种思路早就见过不少了。。。…

LeetCode 1323. 6 和 9 组成的最大数字

1. 题目 给你一个仅由数字 6 和 9 组成的正整数 num。 你最多只能翻转一位数字&#xff0c;将 6 变成 9&#xff0c;或者把 9 变成 6 。 请返回你可以得到的最大数字。 示例 1&#xff1a; 输入&#xff1a;num 9669 输出&#xff1a;9969 解释&#xff1a; 改变第一位数字…

Spring Cloud实战小贴士:Zuul统一异常处理(二)

在前几天发布的《Spring Cloud实战小贴士&#xff1a;Zuul统一异常处理&#xff08;一&#xff09;》一文中&#xff0c;我们详细说明了当Zuul的过滤器中抛出异常时会发生客户端没有返回任何内容的问题以及针对这个问题的两种解决方案&#xff1a;一种是通过在各个阶段的过滤器…

论文浅尝 | Explainable Link Prediction in Knowledge Hypergraphs

笔记整理&#xff1a;陈子睿&#xff0c;天津大学硕士论文链接&#xff1a;https://dl.acm.org/doi/10.1145/3511808.3557316动机知识超图链接预测已被认为是各种知识使能下游应用的关键问题。然而&#xff0c;大多数现有方法主要以黑盒方式执行链接预测&#xff0c;它们学习实…

吴恩达入驻知乎,涨粉秒过万!知乎首答:如何系统学习机器学习

文 | 卖萌酱大家好&#xff0c;我是卖萌酱。昨天在知乎timeline上刷到一个问题&#xff1a;虽然卖萌酱已经不需要系统学习机器学习了&#xff0c;但无意间发现最高赞的id竟然叫“吴恩达”&#xff1f;&#xff1f;好家伙&#xff0c;看了看回答日期&#xff0c;是4月8号。戳进去…

学术会议|第六届知识图谱论坛CNCC-知识图谱赋能大数据大算力

CNCC2022将于12月8日至10日在贵州省贵阳市国际生态会议中心举办&#xff0c;今年CNCC技术论坛数量达到122个&#xff0c;内容涵盖了“计算行业、人工智能、云计算、教育、安全”等30个方向。本文特别介绍将于12月9日举行的【第六届知识图谱论坛-知识图谱赋能大数据大算力】。报…

LeetCode 第 18 场双周赛(188/587,前32%)

文章目录1. 比赛结果2. 题目LeetCode 1331. 数组序号转换 easyLeetCode 1328. 破坏回文串 mediumLeetCode 1329. 将矩阵按对角线排序 mediumLeetCode 1330. 翻转子数组得到最大的数组值 hard1. 比赛结果 做出来了1, 2, 3题&#xff0c;第4题提交超时 2. 题目 LeetCode 1331.…

Spring Cloud实战小贴士:Zuul统一异常处理(一)

在上一篇《Spring Cloud源码分析&#xff08;四&#xff09;Zuul&#xff1a;核心过滤器》一文中&#xff0c;我们详细介绍了Spring Cloud Zuul中自己实现的一些核心过滤器&#xff0c;以及这些过滤器在请求生命周期中的不同作用。我们会发现在这些核心过滤器中并没有实现error…

ACL’22 | 为大模型定制的数据增强方法FlipDA,屠榜六大NLU 数据集

本文转载自公众号“夕小瑶的卖萌屋”&#xff0c;专业带逛互联网算法圈的神操作 -----》我是传送门 关注后&#xff0c;回复以下口令&#xff1a; 回复【789】 &#xff1a;领取深度学习全栈手册&#xff08;含NLP、CV海量综述、必刷论文解读&#xff09; 回复【入群】&#xf…

技术动态 | 面向可解释性的知识图谱推理研究

导读&#xff1a;本次演讲的主题是面向可解释性的知识图谱推理研究&#xff0c;报告分为以下 5 个部分&#xff1a;研究背景前沿进展研究动机近期研究研究展望分享嘉宾&#xff5c;万国佳 武汉大学 计算机学院 博士后编辑整理&#xff5c;xiaomei出品平台&#xff5c;DataFunTa…

LeetCode 1332. 删除回文子序列

1. 题目 给你一个字符串 s&#xff0c;它仅由字母 ‘a’ 和 ‘b’ 组成。每一次删除操作都可以从 s 中删除一个回文 子序列。 返回删除给定字符串中所有字符&#xff08;字符串为空&#xff09;的最小删除次数。 「子序列」定义&#xff1a;如果一个字符串可以通过删除原字符…

Spring Cloud源码分析(四)Zuul:核心过滤器

通过之前发布的《Spring Cloud构建微服务架构&#xff08;五&#xff09;服务网关》一文&#xff0c;相信大家对于Spring Cloud Zuul已经有了一个基础的认识。通过前文的介绍&#xff0c;我们对于Zuul的第一印象通常是这样的&#xff1a;它包含了对请求的路由和过滤两个功能&am…

预训练再次跨界!百度提出ERNIE-GeoL,地理位置-语言联合预训练!

源 | 百度NLP本文介绍『文心大模型』的一项最新工作&#xff1a;“地理位置-语言”预训练模型ERNIE-GeoL。论文链接&#xff1a;https://arxiv.org/abs/2203.09127实践中的观察近年来&#xff0c;预训练模型在自然语言处理、视觉等多个领域都取得了显著效果。基于预训练模型&am…

LeetCode 1333. 餐厅过滤器(Lambda排序)

1. 题目 给你一个餐馆信息数组 restaurants&#xff0c;其中 restaurants[i] [idi, ratingi, veganFriendlyi, pricei, distancei]。你必须使用以下三个过滤器来过滤这些餐馆信息。 其中素食者友好过滤器 veganFriendly 的值可以为 true 或者 false&#xff0c;如果为 true …

Spring Cloud实战小贴士:Zuul处理Cookie和重定向

由于我们在之前所有的入门教程中&#xff0c;对于HTTP请求都采用了简单的接口实现。而实际使用过程中&#xff0c;我们的HTTP请求要复杂的多&#xff0c;比如当我们将Spring Cloud Zuul作为API网关接入网站类应用时&#xff0c;往往都会碰到下面这两个非常常见的问题&#xff1…

论文浅尝 | Language Models (Mostly) Know What They Know

笔记整理&#xff1a;程思源、梁孝转&#xff0c;浙江大学在读硕士&#xff0c;研究方向为知识图谱的表示学习&#xff0c;自然语言处理&#xff0c;预训练对于一个语言模型&#xff0c;我们最终希望得到一个“诚实”的人工智能系统&#xff0c;即语言模型需要准确并且忠实地评…

百度AI技术盛宴来了!大咖齐聚解读CV/NLP/跨模态大模型技术!

随着人工智能步入工业大生产阶段&#xff0c;AI大模型正在加速走出实验室&#xff0c;在全球范围内逐步实现产业落地应用的突破。自2020年至今&#xff0c;越来越多的科技巨头和科研机构参与其中。去年12月&#xff0c;百度发布了全球首个知识增强千亿级大模型——鹏城-百度文心…

Spring Cloud实战小贴士:健康检查

今天在博客的交流区收到一条不错的问题&#xff0c;拿出来给大家分享一下。具体问题如下&#xff1a; 因为项目里面用到了redis集群&#xff0c;但并不是用spring boot的配置方式&#xff0c;启动后项目健康检查老是检查redis的时候状态为down&#xff0c;导致注册到eureka后项…

恕我直言,你的模型可能并没看懂 prompt 在说啥

本文转载自公众号“夕小瑶的卖萌屋”&#xff0c;专业带逛互联网算法圈的神操作 -----》我是传送门 关注后&#xff0c;回复以下口令&#xff1a; 回复【789】 &#xff1a;领取深度学习全栈手册&#xff08;含NLP、CV海量综述、必刷论文解读&#xff09; 回复【入群】&#xf…