IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> Dubbo 笔记1 -> 正文阅读

[网络协议]Dubbo 笔记1

Dubbo 是一款微服务开发框架,它提供了 RPC通信 与 微服务治理 两大关键能力。

1. RPC

远程过程调用协议RPC(Remote Procedure Call Protocol)-----允许像调用本地服务一样调用远程服务。

决定 RPC 的两个重要因素:服务之间的通信,消息的序列化与反序列化(二进制流>Json>xml)。

2. Dubbo概念

  • Container : 容器

  • Provider : 服务提供者

  • Registry:注册中心

  • Consumer:消费者

  • Monitor :监控

0.容器启动初始化 —> 1.服务提供者在注册中心中注册

2.消费者订阅注册中心 —> 3.注册中心返回给消费者,已经注册的服务,或者服务下线

4.消费者调用服务接口获取服务提供者返回的消息

5.消费者,服务提供者每次请求都会被监视

3. Dubbo 注册中心配置

Dubbo 的5种注册中心的配置手册

Dubbo 推荐 Zookeeper 作为注册中心

下载地址:https://archive.apache.org/dist/zookeeper/

# 启动zk服务
mac@basil bin % zkServer.sh start
# 启动zk客户端
mac@basil bin % zkCli.sh
# 查看zk服务状态
mac@basil bin % zkServer.sh status

# 创建临时带序号节点并赋值
create -e -s /basil "hello"
# 获取临时带序号节点的值
get /basil0000000001
# 设置临时带序号节点的值
set /basil0000000001 123456
# 删除临时带序号节点
delete /basil0000000001

4. Dubbo 监控中心配置

dubbo-admin

用户名密码均为 root

# 进入 dubbo-admin-server 打包项目
mvn clean -Dmaven.test.skip=true package
# 运行打包好的监控中心
java -jar dubbo-admin-server-0.4.0.jar

# 进入 dubbo-admin-ui 启动项目 访问 http://localhost:8082
npm run dev

注意:zk3.5以后的版本, 会自动占用8080端口,启动 dubbo-admin-server 前,需修改zk配置文件(zoo.cfg)如下:

 admin.serverPort=8887

5. Dubbo 与 Spring 整合

使用 maven 构建项目

gmall-interface:

? JavaBean 、 服务接口 、异常 层

pojo 类:

@Data
@Builder
public class UserAddress implements Serializable {

    private Integer id;
    /**
     * 用户id
     */
    private String userId;
    /**
     * 用户地址
     */
    private String userAddress;
    /**
     * 收货人
     */
    private String consignee;
    /**
     * 手机号
     */
    private String phoneNum;

    /**
     * 是否默认收货地址 Y:是,N:不是
     */
    private String isDefault;

}

service 类:

public interface OrderService {

    /**
     * 初始化订单
     *
     * @param userId 用户ID
     */
    void initOrder(String userId);
}
public interface UserService {

    /**
     * 获取用户收货地址
     *
     * @param userId 用户id
     * @return List<UserAddress>
     */
    List<UserAddress> getUserAddressList(String userId);
}

user-service-provider :

? 服务提供者

//这里的注解任然是spring提供的
@Service
public class UserServiceImpl implements UserService {
    @Override
    public List<UserAddress> getUserAddressList(String userId) {
        System.out.println("用户id:" + userId);
        UserAddress userAddress1 = UserAddress.builder()
                .id(1)
                .consignee("林先生")
                .userAddress("广东省深圳市南山区")
                .phoneNum("12345568")
                .userId("1")
                .isDefault("Y")
                .build();

        UserAddress userAddress2 = UserAddress.builder()
                .id(2)
                .consignee("李先生")
                .userAddress("广东省深圳市龙岗")
                .phoneNum("12345568")
                .userId("1")
                .isDefault("N")
                .build();

        return Arrays.asList(userAddress1, userAddress2);
    }
}
public class MainApplication {

    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");
        ioc.start();

        System.in.read();
    }
}

order-service-consumer:

? 消费者,接口调用者

@Service
public class OrderServiceImpl implements OrderService {
    UserService userService;

    public OrderServiceImpl(UserService userService) {
        this.userService = userService;
    }

    @Override
    public void initOrder(String userId) {
        //1。查询用户收货地址
        List<UserAddress> addressList = userService.getUserAddressList("1");
        for (UserAddress userAddress : addressList) {
            System.out.println(userAddress.getUserAddress());
        }
    }
}
public class MainApplication {

    @SuppressWarnings("resource")
    public static void main(String[] args) throws IOException {

        ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("consumer.xml");
        OrderService orderService = ioc.getBean(OrderService.class);
        orderService.initOrder("1");
        System.out.println("调用完成。。。。");
        System.in.read();
    }
}

为了能使 消费者 远程调用 服务提供者 的服务,我们还需要创建一下文件:

在服务提供者的资源目录下创建配置文件:

<?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">

    <!--1。指定当前应用名字    -->
    <dubbo:application name="user-service-provider"/>

    <!--2.指定注册中心的位置-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>

    <!--3.指定通信规则(通信协议,端口)-->
    <dubbo:protocol name="dubbo" port="20881"/>

    <!--4.暴露服务 reformat 指向服务的真正服务实现-->
    <dubbo:service interface="com.cn.service.UserService" ref="userServiceImpl"/>

    <!--服务实现-->
    <bean id="userServiceImpl" class="com.cn.service.impl.UserServiceImpl"/>
</beans>

在消费者的资源目录下创建配置文件:

<?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"
       xmlns:context="http://www.springframework.org/schema/context"
       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 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    <!--包扫描-->
    <context:component-scan base-package="com.cn.service.impl"/>

    <!--1。指定当前应用名字    -->
    <dubbo:application name="order-service-consumer"/>

    <!--2.指定注册中心的位置-->
    <dubbo:registry address="zookeeper://127.0.0.1:2181"/>

    <!--声明需要远程调用的服务接口,生成远程服务代理-->
    <dubbo:reference interface="com.cn.service.UserService" id="userService"/>

</beans>

先后启动服务提供者及消费者可在监控中心发现:

6. Dubbo 与 SpringBoot 整合

创建 boot-user-service-provider SpringBoot工程与 boot-order-service-consumer web工程

dubbo 坐标

   <!-- Dubbo Spring Boot Starter -->
<dependency>
  <groupId>org.apache.dubbo</groupId>
  <artifactId>dubbo-spring-boot-starter</artifactId>
  <version>2.7.8</version>
</dependency>
<dependency>
  <groupId>org.apache.curator</groupId>
  <artifactId>curator-recipes</artifactId>
  <version>5.1.0</version>
</dependency>

修改 gmall-interface 接口

public interface OrderService {

    /**
     * 初始化订单
     *
     * @param userId 用户ID
     * @return  List
     */
    List<UserAddress> initOrder(String userId);
}

修改 user-service-provider 配置文件:

dubbo:
  # 指定当前应用名字
  application:
    name: boot-user-service-provider
  # 指定注册中心的位置
  registry:
    address: zookeeper://127.0.0.1:2181
  # 指定通信规则(通信协议,端口)
  protocol:
    name: dubbo
    port: 20881

启动类:

@EnableDubbo 启动dubbo的注解

@DubboService 注册服务注解

//启动dubbo注解
@EnableDubbo
@SpringBootApplication
public class BootUserServiceProviderApplication {

    public static void main(String[] args) {
        SpringApplication.run(BootUserServiceProviderApplication.class, args);
    }

}
//这个注解是将服务进行注册
@DubboService 
public class UserServiceImpl implements UserService {
    @Override
    public List<UserAddress> getUserAddressList(String userId) {
        UserAddress userAddress1 = UserAddress.builder()
                .id(1)
                .consignee("林先生")
                .userAddress("广东省深圳市南山区")
                .phoneNum("12345568")
                .userId("1")
                .isDefault("Y")
                .build();

        UserAddress userAddress2 = UserAddress.builder()
                .id(2)
                .consignee("李先生")
                .userAddress("广东省深圳市龙岗")
                .phoneNum("12345568")
                .userId("1")
                .isDefault("N")
                .build();
        return Arrays.asList(userAddress1, userAddress2);
    }
}

修改 boot-order-service-consumer 配置文件

server:
  port: 8567

dubbo:
  #  指定当前应用名字
  application:
    name: boot-order-service-consumer
  #  指定注册中心的位置
  registry:
    address: zookeeper://127.0.0.1:2181
  # 监控中心地址
  monitor:
    protocol: registry

@DubboReference 远程引用服务注解

@Service
public class OrderServiceImpl implements OrderService {

    //远程引用服务
    @DubboReference
    UserService userService;

    @Override
    public List<UserAddress> initOrder(String userId) {
        System.out.println("用户id: " + userId);
        //1。查询用户收货地址
        List<UserAddress> addressList = userService.getUserAddressList("1");

        return addressList;
    }
}

controller

@RestController
public class OrderController {

    private final OrderService orderService;

    public OrderController(OrderService orderService) {
        this.orderService = orderService;
    }

    @GetMapping("/order/{userId}")
    public List<UserAddress> getList(@PathVariable String userId) {
        return orderService.initOrder(userId);
    }
}

启动服务,访问 http://localhost:8567/order/1

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-04-15 00:40:35  更:2022-04-15 00:46:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/30 3:00:58-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码