微服务篇-B 深入理解SOA框架(Dubbo)_I 服务注册和发现(学习总结)

                                                                                                 原创作者:田超凡(程序员田宝宝)

版权所有,转载请注明原作者,严禁复制转载

Part 1 理论部分

1 什么是Dubbo?

Dubbo是一个面向服务设计的SOA框架,提供了高性能、透明化的RPC远程服务调用的能力、出色的SOA服务治理能力,可以支撑起上千个服务每天超过几十亿次的访问,被广泛应用于阿里巴巴及其成员子公司和外界公司的面向服务设计的项目中。

2 Dubbo的组成部分?

Dubbo有三个核心组成部分:服务提供方、服务消费方、注册中心

服务提供方:负责提供服务,将服务发布到注册中心中

服务消费方:负责从注册中心中获取需要的服务进行消费

注册中心:负责服务注册和发现、服务治理。

3 Dubbo服务注册和发现可能存在的问题?

对于服务提供方:负责发布服务,随着项目规模的日益扩大,需要发布的服务数量、类型也会不断膨胀,降低了服务发布的执行效率。

对于服务消费方:他只关心如何获取需要的服务,随着项目规模的日益扩大,需要从注册中心获取的服务数量也会不断增多,降低了服务调用的执行效率。

还有一种情况,就是在使用dubbo的项目中,很多服务会同时兼具两种角色,即既是服务提供方,也是服务消费方,既需要发布服务到注册中心,也需要从注册中心获取需要的服务进行消费。

综上所述,只有对服务进行统一管理,才能有效的优化内部应用的服务发布和订阅的流程和管理,注册中心可以通过特定协议实现服务对外的统一。

4 Dubbo支持的注册中心?

Multicast注册中心

Zookeeper注册中心

Redis注册中心

Simple注册中心

5 Dubbo的优点和缺点?

优点:

1 提供了高性能、透明化的RPC远程服务调用能力

在Dubbo中,可以像调用本地方法一样进行RPC远程服务调用,真正实现了API零侵入。

2 出色的SOA服务治理能力

在Dubbo中,基于内置的dubbo-admin和dubbo-monitor模块,实现了较为完整的接口管理和监控服务,对于同一个应用中的接口,可以实现多类型、多版本、多注册中心的管理。

3 软负载均衡和容错机制

  1. 在内网环境下可以替代nginx、lvs等硬负载均衡,实现软负载均衡。
  2. 基于zookeeper提供的命名服务特性,服务提供方在服务发布的时候不需要提供完整的服务IP地址到注册中心,注册中心可以根据服务名称动态获取服务IP地址,服务消费方可以根据服务名称到注册中心中获取需要的服务的IP地址。
  3. 推荐使用类似zookeeper这样的分布式协调服务作为注册中心,可以将全局项目配置统一移入到zookeeper中进行管理。

缺点:语言局限性,只支持Java语言。

6 Dubbo支持的协议?

dubbo支持dubbo、rmi、http、webservice等多种协议,但是官方只推荐我们使用dubbo协议。

7 SpringCloud和Dubbo的区别?

相同点:SpringCloud和dubbo都是面向服务设计的框架,都提供了RPC远程服务调用能力,以及服务注册和发现、服务治理的能力。

不同点:

  1. SpringCloud是一个目前比较主流的微服务框架,官方更新迭代的速度非常快并且较为完善和稳定。服务拆分粒度比较细,官方提倡各个服务之间的数据源相互独立、互不干涉,数据传输基于Restful实现(HTTP+JSON),数据传输效率高,项目配置轻松灵活,内部已经实现了比较常见的微服务解决方案,基本做到了拆箱即用,比如:ribbon负载均衡、feign/openfeign RPC客户端、eureka注册中心、hystrix服务保护、zuul/gateway网关、config配置中心、sleuth+zipkin服务链路追踪、bus/amqp消息总线,swagger API管理工具等等。
  2. Dubbo是一个面向服务设计的SOA框架,官方更新迭代速度非常慢(官方更新迭代的重心已经转移到了SpringCloudAlibaba中),服务拆分粒度粗,服务共享数据源,数据源不能做到相互独立,数据传输基于SOAP实现(HTTP+XML),数据传输效率低,项目配置不灵活,只支持XML方式的配置,内部实现的功能没有SpringCloud完善,只实现了基本的服务注册和发现、服务治理的能力,其他的微服务解决方案没有实现,比如:RPC客户端、配置中心、服务链路、网关、消息总线等等。如果需要使用其他的微服务解决方案,则需要自行寻找第三方框架并自行组装,第三方框架可能还会存在兼容性问题。

总结:在使用dubbo的项目中,如果需要使用其他的微服务解决方案,则需要自行寻找组件并自行组装,可能还会存在兼容性问题。但是如果使用SpringCloud,因为它内部已经实现了常见的很多微服务解决方案,是一个较为完善的微服务全家桶,容易拆箱即用。

Part 2 实践部分

Dubbo快速入门

环境步骤:

  1. 安装Zookeeper启动
  2. 创建Maven项目搭建生产者和消费者
  3. 安装DubboAdmin平台,实现监控

Zookeeper介绍与安装

Dubbo注册中心采用的是Zookeeper。为什么采用Zookeeper呢?

Zookeeper是一个分布式的服务框架,是树型的目录服务的数据存储,能做到集群管理数据,能很好的作为Dubbo服务的注册中心。

Dubbo能与Zookeeper做到集群部署,当提供者出现断电等异常停机时,Zookeeper注册中心能自动删除提供者信息,当提供者重启时,能自动恢复注册数据,以及订阅请求

创建Maven工程

项目结构:

主要分三大模块:

Ittcf-dubbo-api : 存放公共接口;

Ittcf-dubbo-consumer : 调用远程服务;

Ittcf-dubbo-provider : 提供远程服务。

Ittcf-dubbo-api 新建接口

public interface DemoApiService {

    public String getUser(Long userId);

}

生产者提供服务接口

ittcf-dubbo-provider 实现接口业务逻辑

public class DemoApiServiceImpl implements DemoApiService {

     public String getUser(Long userId) {

           System.out.println("生产者调用消费者服务接口userId:" + userId);

           return "tianbaobao";

     }

}

Maven依赖信息

<dependencies>

           <dependency>

                <groupId>com.ittcf</groupId>

                <artifactId>ittcf-dubbo-api</artifactId>

                <version>0.0.1-SNAPSHOT</version>

           </dependency>

           <dependency>

                <groupId>com.101tec</groupId>

                <artifactId>zkclient</artifactId>

                <version>0.10</version>

           </dependency>

           <dependency>

                <groupId>commons-logging</groupId>

                <artifactId>commons-logging</artifactId>

                <version>1.2</version>

           </dependency>

           <dependency>

                <groupId>org.jboss.netty</groupId>

                <artifactId>netty</artifactId>

                <version>3.2.5.Final</version>

           </dependency>

           <dependency>

                <groupId>org.springframework</groupId>

                <artifactId>spring-context</artifactId>

                <version>4.3.9.RELEASE</version>

           </dependency>

           <dependency>

                <groupId>com.alibaba</groupId>

                <artifactId>dubbo</artifactId>

                <version>2.5.3</version>

                <exclusions>

                     <exclusion>

                          <groupId>org.springframework</groupId>

                          <artifactId>spring</artifactId>

                     </exclusion>

                     <exclusion>

                          <groupId>org.jboss.netty</groupId>

                          <artifactId>netty</artifactId>

                     </exclusion>

                </exclusions>

           </dependency>

     </dependencies>

新增 dubbo-provider.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"

      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

      xsi:schemaLocation="http://www.springframework.org/schema/beans

       http://www.springframework.org/schema/beans/spring-beans.xsd

       http://code.alibabatech.com/schema/dubbo

       http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

      <!--定义了提供方应用信息,用于计算依赖关系;在 dubbo-admindubbo-monitor 会显示这个名字,方便辨识 -->

      <dubbo:application name="demotest-provider" />

      <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper -->

      <dubbo:registry address="zookeeper://localhost:2181" />

      <!-- dubbo协议在20880端口暴露服务 -->

      <dubbo:protocol name="dubbo" port="20880" />

      <!--使用 dubbo 协议实现定义好的 api.PermissionService 接口 -->

      <dubbo:service interface="com.ittcf.demo.api.service.DemoApiService"

            ref="demoService" protocol="dubbo" />

      <!--具体实现该接口的 bean -->

      <bean id="demoService" class="com.ittcf.demo.api.service.impl.DemoApiServiceImpl" />

</beans>

启动发布服务

        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("provider.xml");

        System.out.println(context.getDisplayName() + ": here");

        context.start();

        System.out.println("服务已经启动...");

        System.in.read();

消费者调用服务接口

Maven依赖信息

      <dependencies>

            <dependency>

                  <groupId>com.ittcf</groupId>

                  <artifactId>ittcf-dubbo-api</artifactId>

                  <version>0.0.1-SNAPSHOT</version>

            </dependency>

            <dependency>

                  <groupId>com.101tec</groupId>

                  <artifactId>zkclient</artifactId>

                  <version>0.10</version>

            </dependency>

            <dependency>

                  <groupId>commons-logging</groupId>

                  <artifactId>commons-logging</artifactId>

                  <version>1.2</version>

            </dependency>

            <dependency>

                  <groupId>org.jboss.netty</groupId>

                  <artifactId>netty</artifactId>

                  <version>3.2.5.Final</version>

            </dependency>

            <dependency>

                  <groupId>org.springframework</groupId>

                  <artifactId>spring-context</artifactId>

                  <version>4.3.9.RELEASE</version>

            </dependency>

            <dependency>

                  <groupId>com.alibaba</groupId>

                  <artifactId>dubbo</artifactId>

                  <version>2.5.3</version>

                  <exclusions>

                        <exclusion>

                              <groupId>org.springframework</groupId>

                              <artifactId>spring</artifactId>

                        </exclusion>

                        <exclusion>

                              <groupId>org.jboss.netty</groupId>

                              <artifactId>netty</artifactId>

                        </exclusion>

                  </exclusions>

            </dependency>

      </dependencies>

调用服务接口

      ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("consumer.xml");

            context.start();

            System.out.println("consumer start");

            DemoApiService demoApiService = context.getBean(DemoApiService.class);

            String result = demoApiService.getUser(1l);

            System.out.println("result:" + result);

消费者配置文件

本文部分素材转载自蚂蚁课堂

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

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

相关文章

denied: requested access to the resource is denied报错解决

Docker 镜像在文件中包含一组指令&#xff0c;可在 Docker 容器中执行代码。大多数情况下&#xff0c;在创建 docker 镜像之后&#xff0c;当尝试将镜像推送到远程仓库时&#xff0c;会发生这种类型的报错“Docker denied: requested access to the resource is denied” 由于错…

RabbitMQ - 07 - 通过注解创建队列和交换机

之前消息模型的实现,都是通过rabbitMQ Management 控制台来手动创建 queue 和 exchange 的 在项目开发中有两种方式通过代码声明 创建 一种是通过 Bean 方式,这种代码量较大 稍繁琐 一种是通过注解的方式声明 先编写消费者代码 通过注解绑定了 消息队列,交换机,还有 routin…

零售EDI:劳氏 Lowe‘s EDI项目案例

通过 EDI&#xff0c;企业与Lowes之间可以直接交换各种商业文档&#xff0c;如订单、发票、收据等&#xff0c;从而实现信息的实时交换&#xff0c;提高了供应链的效率和准确性。在现代供应链管理中&#xff0c;EDI 已经成为了不可或缺的重要工具。 作为一家拥有多条业务线的企…

SpringCloudFeign远程调用

文章目录 1. Feign 是什么2. Feign 的使用2.1 引入依赖2.2 写接口2.3 服务调用方2.4 启动测试 3. Feign 日志配置4. Feign 使用优化5. 注意包扫描问题6. 注意的问题6.1 参数问题6.2 Feign 自动装配 1. Feign 是什么 Feign 是一个声明式、模板化的 HTTP 客户端&#xff0c;它是…

Intel® Extension for PyTorch*详细安装教程

最近在研究Intel的pytorch的加速拓展Intel Extension for PyTorch*,但是发现官网的文档全是英文的&#xff0c;不太好找安装教程。所以特此分享Intel Extension for PyTorch*的详细安装教程。 文章目录 一、安装所需系统要求1.1 硬件需求1.2 软件需求 二、准备2.1 安装驱动程序…

Linux 进程程序替换

&#x1f493;博主CSDN主页:麻辣韭菜-CSDN博客&#x1f493;   ⏩专栏分类&#xff1a;http://t.csdnimg.cn/G90eI⏪   &#x1f69a;代码仓库:Linux: Linux日常代码练习&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习更多Linux知识   &#x1f51d;&#x1f5…

[leetcode] 946. 验证栈序列

题目描述 给定 pushed 和 popped 两个序列&#xff0c;每个序列中的 值都不重复&#xff0c;只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时&#xff0c;返回 true&#xff1b;否则&#xff0c;返回 false 。 示例 1&#xff1a; 输入 pushed […

力扣530. 二叉搜索树的最小绝对差

思路1&#xff1a;中序遍历&#xff0c;递归排序成有序数组&#xff1b;因为是有序&#xff0c;只需要求相邻两个值的最小差值。 class Solution {ArrayList <Integer> list new ArrayList();int ans 100001;//题目最大 100000public int getMinimumDifference(TreeNo…

动态规划|【路径问题】|174.地下城游戏

题目 174. 地下城游戏 恶魔们抓住了公主并将她关在了地下城 dungeon 的 右下角 。地下城是由 m x n 个房间组成的二维网格。我们英勇的骑士最初被安置在 左上角 的房间里&#xff0c;他必须穿过地下城并通过对抗恶魔来拯救公主。 骑士的初始健康点数为一个正整数。如果他的健…

前端加密面面观:常见场景与方法解析

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

FIT介绍-0

1、背景 FIT是flattened image tree的简称&#xff0c;它采用了device tree source file&#xff08;DTS&#xff09;的语法&#xff0c;生成的image文件也和dtb文件类似&#xff08;称做itb&#xff09;。 结构如下图&#xff1a; 其中image source file(.its)和device tree …

2024年【G2电站锅炉司炉】最新解析及G2电站锅炉司炉复审模拟考试

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 G2电站锅炉司炉最新解析是安全生产模拟考试一点通总题库中生成的一套G2电站锅炉司炉复审模拟考试&#xff0c;安全生产模拟考试一点通上G2电站锅炉司炉作业手机同步练习。2024年【G2电站锅炉司炉】最新解析及G2电站锅…

leetcode-hot100-普通数组

53. 最大子数组和 给你一个整数数组 nums &#xff0c;请你找出一个具有最大和的连续子数组&#xff08;子数组最少包含一个元素&#xff09;&#xff0c;返回其最大和。 子数组 是数组中的一个连续部分。 示例 1&#xff1a; **输入&#xff1a;nums [-2,1,-3,4,-1,2,1,…

IOS覆盖率报告info文件解读

一&#xff0c;IOS覆盖率报告的生成 在做前端精准测试的时候&#xff0c;对于iOS端&#xff0c;通常会做如下操作&#xff1a; &#xff08;1&#xff09;合并覆盖率数据 如下操作&#xff1a; xcrun llvm-profdata merge coverage_file1657885040728.profraw coverage_fil…

LeetCode刷题日志-17.电话号码的字母组合

纯暴力解法&#xff0c;digits有多长&#xff0c;就循环多少次进行字母组合 class Solution {public List<String> letterCombinations(String digits) {List<String> reslut new ArrayList<>();if(digits.equals(""))return reslut;Map<Inte…

2024年科技前瞻:AI辅助研发引领未来创新浪潮

2024 年 AI 辅助研发趋势随着人工智能技术的持续发展与突破&#xff0c;2024年AI辅助研发正成为科技界和工业界瞩目的焦点。从医药研发到汽车设计&#xff0c;从软件开发到材料科学&#xff0c;AI正逐渐渗透到研发的各个环节&#xff0c;变革着传统的研发模式。在这一背景下&am…

视图【MySQL】

文章目录 概念操作视图创建视图查询视图更新视图删除视图 视图规则和限制 概念 MySQL 中的视图&#xff08;View&#xff09;是一个虚拟表&#xff0c;其内容由查询定义。视图本身不包含数据&#xff0c;这些数据是从一个或多个实际表中派生出来的&#xff0c;通过执行视图定义…

LLM RAG系统中消除数据幻觉的几个绝招-OPENAI公司内称的“大招”

前言-什么是数据幻觉&#xff1f;它到底有什么危害呢 我们直接来举例&#xff1a; 我是金银花一区的&#xff0c;附近有什么小学&#xff1f; 此时RAG带出如下信息&#xff1a; 金银花小区一区、二区、三区附近教育资源有&#xff1a;银树大学、建设小学金银花校区、金树高…

使用Python模拟绘制自由落体运动过程中的抛物线

目录 一、引言 二、自由落体运动的基本原理 三、使用Python模拟自由落体运动 四、扩展功能&#xff1a;添加速度曲线和动画效果 五、总结与展望 一、引言 自由落体运动是物理学中最基础的运动形式之一&#xff0c;它描述了一个物体在仅受重力作用下的运动轨迹。在这个…

Django工具

一、分页器介绍 1.1、介绍 分页,就是当我们在页面中显示一些信息列表,内容过多,一个页面显示不完,需要分成多个页面进行显示时,使用的技术就是分页技术 在django项目中,一般是使用3种分页的技术: 自定义分页功能,所有的分页功能都是自己实现django的插件 django-pagin…