当前位置:   article > 正文

Dubbo详解_linux系统dubbo搭建服务

linux系统dubbo搭建服务

集群分布式:

集群:很多"人"一起干活,干一样的事

  • 一个业务模块,部署在多台服务器上

分布式:很多"人"一起,干不一样的事。这些不一样的事,合起来是一件大事。

  • 一个大的业务系统,拆分为小的业务模块,分别部署在不同的机器上。

高性能、高可用、可扩展、可伸缩

RPC:Remote Proceduce Call 远程过程调用。有很多的协议和技术来都是实现了RPC的过程。比如HTTP REST风格,Java RMI规范、WebService SOAP、Hession等等。

垂直架构

分布式架构存在的问题:

  • 服务提供方一旦产生变更、所有消费方都得变更

特点:

  • 服务实现组件化:开发者可以自由选择开发技术,也可以不需要协调其他团队
  • 服务之间交互一般使用REST API
  • 去中心化:每个微服务有自己私有的数据库持久化业务数据
  • 自动化部署:把每个应用都拆分一个一个独立的业务,方便自动化部署、测试、运维。
架构演进:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rNH55nI3-1684219882779)(C:\Users\HUAWEI\AppData\Roaming\Typora\typora-user-images\image-20230512162235674.png)]

SOA架构

SOA:(Service-Oriented Architecture),面向服务的架构是一个组件模型,它将应用程序的不同功能单元(服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来。

微服务:

微服务架构区别于传统的单体软件架构,是一种为了适应当前互联网后台服务的

特点:

  • 解耦– 系统内的服务很大程度上是分离的。因此,整个应用程序可以轻松构建,更改和扩展
  • 组件化– 微服务被视为可以轻松更换和升级的独立组件
  • 业务能力– 微服务非常简单,专注于单一功能
  • 自治– 开发人员和团队可以彼此独立工作,从而提高速度
  • 持续交付– 通过软件创建,测试和批准的系统自动化,允许频繁发布软件
  • 责任– 微服务不关注应用程序作为项目。相反,他们将应用程序视为他们负责的产品
  • 分散治理– 重点是使用正确的工具来做正确的工作。这意味着没有标准化模式或任何技术模式。开发人员可以自由选择最有用的工具来解决他们的问题
  • 敏捷– 微服务支持敏捷开发。任何新功能都可以快速开发并再次丢弃

在这里插入图片描述

dubbo 是一款高性能、轻量级的开源Java RPC 框架,它提供了三大核心能力:面向接口的远程方法调用,只能容错和负载均衡,以及服务自动注册和发现。

服务提供者(Provider): 暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。

服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需要的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者

监控中心(Monitor): 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中.

dubbo 支持的协议

支持多种协议: dubbo、hessian、rmi、http、webservice、thrift、memcached、redis.

dubbo官方推荐使用的是dubbo 协议。dubbo 协议默认端口是20880。

使用dubbo 协议,spring 配置文件加入:

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

测试:

创建服务提供者:
1.创建一个maven web工程:服务的提供者
2.创建一个实体bean查询的结果
3.提供一个服务接口:UserService
4.实现这个服务接口:UserServiceImpl
5.配置dubbo服务提供者的核心配置文件
<?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服务使用提供的名称:保证唯一性-->
    <dubbo:application name="dubbo004-privider"/>
    <!--设置dubbo使用的协议和端口号-->
    <dubbo:protocol name="dubbo" port="20880"/>
    <!--zookeeper注册中心的地址,指定注册中心地址和端口号-->
    <dubbo:registry address="zookeeper://localhost:2181" port="20880"/>
    <!--暴露服务接口-->
    <dubbo:service interface="com.mk.dubbo.service.UserService" ref="userService"/>
    <!--加载业务接口的实现类到spring容器中-->
    <bean id="userService" class="com.mk.dubbo.service.UserServiceImpl"/>
</beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 声明dubbo服务提供者的名称:保证唯一
  • 声明dubbo使用的协议和端口号
  • 暴露服务,使用直连方式
6.添加监听器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!-- Spring配置文件信息 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:/config/dubbo-userservice-provider.xml</param-value>
    </context-param>
    <!-- ContextLoaderListener监听器 -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
</web-app>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
创建服务的消费者:
  1. 创建一个maven web 工程:服务的消费者
  2. 配置pom文件添加需要的依赖(spring,dubbo)
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>4.3.18.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.7</version>
        </dependency>
        <!--引入接口工程-->
        <dependency>
            <groupId>org.example</groupId>
            <artifactId>dubbo003-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <!--注册中心-->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.1.0</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  1. 配置dubbo的核心配置文件
<?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内部使用的唯一标识-->
    <dubbo:application name="dubbo005-consumer"/>
    <!--指定注册中心-->
    <!--使用linux的注册中心-->
<!--<dubbo:registry address="zookeeper://localhost:2181"/>-->
    <dubbo:registry address="zookeeper://localhost:192.168.154.128:2181"/>
    <!--引用远程接口服务-->
    <dubbo:reference id="userService"
                     interface="com.mk.dubbo.service.UserService"
                     url="dubbo://localhost:20880"/>
</beans>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  1. 写一个控制层(controller)
@Controller
public class UserController {
    @Autowired
    private UserService userService;

    @RequestMapping(value = "/userDetail")
    public String userDetail(Model model, Integer id,String username){
        //根据用户标识获取用户详情
        User user = userService.queryUserById(id,username);
        model.addAttribute("user", user);
        return "userDetail";
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  1. 配置中央调度器(就是一个servlet:(DispatcherServlet))

测试结果:

在这里插入图片描述

粒度
  • 服务接口尽可能加大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤
  • 服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸。
  • 不建议使用过于抽象的通用接口,如: Map query(Map),这样的接口没有明确语义,会给后期维护带来不便。
注册中心概述:

对于服务的提供方,它需要发布服务,而且由于应用系统的复杂性,服务数量、类型也不断膨胀;对于服务方消费方

dubbo支持的注册中心是:

  • Multicast

Multicast 注册中心不需要启动任何中心节点,只要广播地址一样,就可以互相发现。

  • Zookeeoer

Zookeeper 是一个树型的目录服务,支持变更推送,适合作为 Dubbo 服务的注册中心,工业强度较高,可用于生产环境,并推荐使用

  • Nacos

Nacos 是最近由 Alibaba 推出快速实现动态服务发现、服务配置、服务元数据及流量管理、多租户的开源项目。同时支持注册中心、配置中心分离和合并部署。

  • Redis

基于 Redis 实现的注册中心,使用 Redis 的 Key/Map 结构存储数据结构,使用 Redis 的 Publish/Subscribe 事件通知数据变更。

  • Simple

Simple 注册中心本身就是一个普通的 Dubbo 服务,可以减少第三方依赖,使整体通讯方式一致。

Zookeeper Windows下的安装:

首先进入apache官网

  1. 进入官网下载zookeeper的压缩包
  2. 解压到常用目录下
  3. 将conf目录下zoo_sample.cfg文件,复制一份,重命名为zoo.cfg
  4. 在安装目录下新建两个目录文件 log 和 data文件夹
  5. 修改zoo.cfg配置文件,将dataDir=/tmp/zookeeper修改成zookeeper (tmp为你的安装路径)

Zookeeper Linux下的安装:

Linux下的安装与windows类似

Zookeeper的相关属性

关闭检查

dubbo 缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring 初始化完成,以便上线时,能及早发现问题,默认check=true。通过check="false"关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。

超时时间

由于网络或服务端不可靠,会导致调用出现一种不确定的中间状态(超时).为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间

timeout:调用远程服务超时时间(毫秒)

版本号

每个接口都应定义版本号,为后续不兼容升级提供可能。当一个接口有不同的实现,项目早期使用的一个实现类,之后创建接口的新的实现类。区分不同的接口实现使用version。

线时,能及早发现问题,默认check=true。通过check="false"关闭检查,比如,测试时,有些服务不关心,或者出现了循环依赖,必须有一方先启动。

超时时间

由于网络或服务端不可靠,会导致调用出现一种不确定的中间状态(超时).为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间

timeout:调用远程服务超时时间(毫秒)

版本号

每个接口都应定义版本号,为后续不兼容升级提供可能。当一个接口有不同的实现,项目早期使用的一个实现类,之后创建接口的新的实现类。区分不同的接口实现使用version。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/771856
推荐阅读
相关标签
  

闽ICP备14008679号