《SpringCloud超级入门》使用Eureka编写服务消费者《十一》

我们先从 Nginx 说起,了解为什么需要微服务。最初的服务化解决方案是给相同服务提供一个统一的域名,然后服务调用者向这个域发送 HTTP 请求,由 Nginx 负责请求的分发和跳转。

这种架构存在很多问题:Nginx 作为中间层,在配置文件中耦合了服务调用的逻辑,这削弱了微服务的完整性,也使得 Nginx 在一定程度上变成了一个重量级的 ESB。图 1 标识出了 Nginx 的转发信息流走向。

Nginx转发的信息流
图 1  Nginx 转发的信息流


服务的信息分散在各个系统,无法统一管理和维护。每一次的服务调用都是一次尝试,服务消费方并不知道有哪些实例在给他们提供服务。这带来了一些问题:

  • 无法直观地看到服务提供方和服务消费方当前的运行状况与通信频率;
  • 消费方的失败重发、负载均衡等都没有统一策略,这加大了开发每个服务的难度,不利于快速演化。


为了解决上面的问题,我们需要一个现成的中心组件对服务进行整合,将每个服务的信息汇总,包括服务的组件名称、地址、数量等。

服务的调用方在请求某项服务时首先通过中心组件获取提供服务的实例信息(IP、端口等),再通过默认或自定义的策略选择该服务的某一提供方直接进行访问,所以考虑引入 Dubbo。

Dubbo 是阿里开源的一个 SOA 服务治理解决方案,文档丰富,在国内的使用度非常高。图 2 为 Dubbo 的基本架构图,使用 Dubbo 构建的微服务已经可以较好地解决上面提到的问题。

Dubbo的基本架构图
图 2  Dubbo 的基本架构图


从图 2 中,可以看出以下几点:

  • 调用中间层变成了可选组件,消费方可以直接访问服务提供方;
  • 服务信息被集中到 Registry 中,形成了服务治理的中心组件;
  • 通过 Monitor 监控系统,可以直观地展示服务调用的统计信息;
  • 服务消费者可以进行负载均衡、服务降级的选择。


但是对于微服务架构而言,Dubbo 并不是十全十美的,也有一些缺陷,比如:

  • Registry 严重依赖第三方组件(ZooKeeper 或者 Redis),当这些组件出现问题时,服务调用很快就会中断。
  • Dubbo 只支持 RPC 调用。这使得服务提供方与调用方在代码上产生了强依赖,服务提供方需要不断将包含公共代码的 Jar 包打包出来供消费方使用。一旦打包出现问题,就会导致服务调用出错。


我认为,Dubbo 和 Spring cloud 并不是完全的竞争关系,两者所解决的问题域并不一样。

Dubbo 的定位始终是一款 RPC 框架,而 Spring Cloud 的目标是微服务架构下的一站式解决方案。如果非要比较的话,Dubbo 可以类比到 Netflix OSS 技术栈,而 Spring Cloud 集成了 Netflix OSS 作为分布式服务治理解决方案,但除此之外 Spring Cloud 还提供了配置、消息、安全、调用链跟踪等分布式问题解决方案。

当前由于 RPC 协议、注册中心元数据不匹配等问题,在面临微服务基础框架选型时 Dubbo 与 Spring Cloud 只能二选一,这也是大家总是拿 Dubbo 和 Spring Cloud 做对比的原因之一。

Dubbo 已经适配到 Spring Cloud 生态,比如作为 Spring Cloud 的二进制通信方案来发挥 Dubbo 的性能优势,Dubbo 通过模块化以及对 HTTP 的支持适配到 Spring Cloud。

Spring Cloud 好在哪里

作为新一代的服务框架,Spring Cloud 提出的口号是开发“面向云的应用程序”,它为微服务架构提供了更加全面的技术支持。结合我们一开始提到的微服务的诉求,参见表 1,把Spring Cloud 与 Dubbo 进行一番对比。

                                          表 1 Spring Cloud与Dubbo功能对比

Spring Cloud 抛弃了 Dubbo 的 RPC 通信,采用的是基于 HTTP 的 REST 方式。严格来说,这两种方式各有优劣。虽然从一定程度上来说,后者牺牲了服务调用的性能,但也避免了上面提到的原生 RPC 带来的问题。而且 REST 相比 RPC 更为灵活,服务提供方和调用方,不存在代码级别的强依赖,这在强调快速演化的微服务环境下显得更加合适。

很明显,Spring Cloud 的功能比 Dubbo 更加强大,涵盖面更广,而且作为 Spring 的拳头项目,它也能够与 Spring Framework、Spring Boot、Spring Data、Spring Batch 等其他 Spring 项目完美融合,这些对于微服务而言是至关重要的。

前面提到,微服务背后一个重要的理念就是持续集成、快速交付,而在服务内部使用一个统一的技术框架,显然比将分散的技术组合到一起更有效率。

更重要的是,相比于 Dubbo,它是一个正在持续维护的、社区更加火热的开源项目,这就可以保证使用它构建的系统持续地得到开源力量的支持。

下面列举 Spring Cloud 的几个优势。

  • Spring Cloud 来源于 Spring,质量、稳定性、持续性都可以得到保证。
  • Spirng Cloud 天然支持 Spring Boot,更加便于业务落地。
  • Spring Cloud 发展得非常快,从开始接触时的相关组件版本为 1.x,到现在将要发布 2.x 系列。
  • Spring Cloud 是 Java 领域最适合做微服务的框架。

上一篇 使用Eureka编写服务提供者 

下一篇介绍 Eureka注册中心开启密码认证

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

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

相关文章

java echarts 散点图,echarts在地图上绘制散点图(任意点)

项目需求:在省份地图上绘制散点图,散点位置不一定是哪个城市或哪个区县,即任意点通过查询官网文档,找到一个与需求类似的Demo:https://www.echartsjs.com/gallery/editor.html?cscatter-map,更改代码&…

《SpringCloud超级入门》Eureka注册中心开启密码认证《十二》

Eureka 自带了一个 Web 的管理页面,方便我们查询注册到上面的实例信息,但是有一个问题:如果在实际使用中,注册中心地址有公网 IP 的话,必然能直接访问到,这样是不安全的。所以我们需要对 Eureka 进行改造&a…

php如何直接使用iview,iview 使用总结

vueiview 开发后台系统问题总结tags用了keep-alive 包裹 router-view,页面进行缓存点击tag可切换,不会重新渲染在特定页面比如详情页需要每次刷新的时候,添加watch $route 进行相关的刷新,导致了另外一个问题,最初跳转时用的 params传参,刷新参数就没了,特改为query传参.涉及到…

基于java+springboot+mybatis+laiyu实现学科竞赛管理系统《建议收藏》

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

JAVA输出菱形并使用绝对值,案例用绝对值的方法打印出菱形

import java.util.Scanner;public class Test {public static void main(String[] args) {Scanner sc new Scanner(System.in);System.out.println("请输入菱形的层高(层高为奇数):");int num sc.nextInt();// 控制输入层高为奇数while (num % 2 0) {System.out.p…

基于java TCP实现网络通信聊天室《建议收藏附完整源码》

🍅 作者主页:Java李杨勇 🍅 简介:Java领域优质创作者🏆、Java李杨勇公号作者✌ 简历模板、学习资料、面试题库、技术互助【关注我,都给你】 🍅 欢迎点赞 👍 收藏 ⭐留言 &#x1f…

mysql 获取年预提,【判断题】正确核算待摊费用和预提费用,有助于划分本期费用与非本期费用的界限。...

【判断题】正确核算待摊费用和预提费用,有助于划分本期费用与非本期费用的界限。更多相关问题[单选] 如果整条线组件压力突然升高,原因可能是()。[多选] 风机的常见故障有()。[单选] 侧吹风窗安装过程中应注意()。[判断题] 组件的压力波动会影响产品的质量。[单选] …

《零基础》MySQL 正则表达式(二十一)

MySQL中使用 REGEXP 操作符来进行正则表达式匹配。 实例操作 查找name字段中以st为开头的所有数据: SELECT name FROM person_tbl WHERE name REGEXP ^st; 查找name字段中以ok为结尾的所有数据: SELECT name FROM person_tbl WHERE name REGEXP ok$;…

ORACLE 12C采坑之 ORA-12541:TNS:无监听程序

目录 1.首先查看oracle12c监听服务是否启动 2. ping 本地id是否能ping通 3.检测配置监听是否有错误: 4.重新配置监听器Net Configuration Assistant 5.之后重启OracleServiceORCL服务 1.首先查看oracle12c监听服务是否启动 2. ping 本地id是否能ping通 3.检测配置监听是否…

无重复字符的最长子串php,LeetCode - 无重复字符的最长子串 - Golang

题目:给定一个字符串,请你找出其中不含有重复字符的 最长子串的长度。示例 1:输入: "abcabcbb"输出: 3解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。示例 2:输入: "bbbbb"输出: 1解释: 因为无重复…

《SpringCloud超级入门》使用Eureka集群搭建《十三》

前面我们搭建的注册中心只适合本地开发使用,在生产环境中必须搭建一个集群来保证高可用。Eureka 的集群搭建方法很简单:每一台 Eureka 只需要在配置中指定另外多个 Eureka 的地址就可以实现一个集群的搭建了。 以 2 个节点为例来说明搭建方式。假设我们有…

centos7 python3 sqlserver,centos7中python3环境支持s

在centos7环境中常规安装python3的话无法支持sqlite3和ssl,所以在安装pytho3是需要带上sqlite3库和ssl库:下载编译安装sqlite3:# wget https://www.sqlite.org/2017/sqlite-autoconf-3170000.tar.gz --no-check-certificate# ./configure --prefix/usr/local/sqlite3 --disable…

《SpringCloud超级入门》Eureka自我保护模式和InstanceID的配置《十四》

关闭自我保护 保护模式主要在一组客户端和 Eureka Server 之间存在网络分区场景时使用。一旦进入保护模式,Eureka Server 将会尝试保护其服务的注册表中的信息,不再删除服务注册表中的数据。当网络故障恢复后,该 Eureka Server 节点会自动退…

matlab中如何表示线积分,MATLAB - 复杂的线/路径积分

我试图使用积分命令在几个圆形闭合路径上找到复杂的线/路径积分 . 我的代码为1 /(z-i)^ 2在圆{z:| z | 2}上逆时针遍历的遍历如下:fun (z) 1 ./((z-1i) .^ 2);;g (t) 2 .*(cos(t) 1i .* sin(t));gprime (t) 2 .*(-sin(t) 1i .* cos(t));q1 integr…

基于HTML+CSS+JavaScript实现---美丽家乡石埇镇(建议收藏)

java毕业设计项目《100套》推荐 目录 前言: 系统首页: 历史沿革: 地理环境: 自然资源: 经济概括: 社会发展: 交通运输: 古迹人物: 古迹详情: 主要…

matlab取高字节,求助!如何将11字节的数提取出其中678三个字节

这是我参考MATLAB函数改写后的函数,基本可以满足你的要求,支持11字节的16进制数的string或string array或cell array输入和相应的输出并且具有检错功能,程序健壮性良好function dyour_solution(h)%YOUR_SOLUTION Convert 11-bytes hexadecima…

ORACLE 实现 ID 自增

前言 目录 前言 具体命令 具体详解: 由于oracle数据库不像mysql一样在建立表的时候设置自动增长列功能 设置UUID的缺点 字符串占用的空间比较大、 而且效率也比较低下、 生成的ID是字符串随机数。做表关联关系的时候不好找、要做排序也不现实 所以通过创建…

php mvc urlencode,PHP – LIUGUOFENG

/*** param $img 图片地址* param string $width 宽* param string $height 高* param string $ratio 保持原比例* return string 生成的地址*/public function resize_fuc($img, $width, $height, $ratio){$info get_img_info($img);$name pathinfo($img)[filename];$dirnam…

《零基础》MySQL 事务(二十二)

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样&#xf…

Java开发基础知识学习总结之(上)-王者笔记建议收藏

目录 一、面向对象概念 1. 面向对象和面向过程的区别? 2. 对象和类的关系?举例说明 3. 类里面包含什么? 4. 类的特性? 封装性 继承性 多态性 二、网络基础 5. DNS是什么? 6. 域名和端口? 7. CDN是什么? 8…