发表于: 2020-02-26 19:20:53

3 1146


啥也不说就是干!!

今天完成的事情:

1、dubbo 概念及流程

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

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

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

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

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

调用关系说明:

1)服务容器负责启动、加载、运行服务提供者。

2)服务提供者在启动时,向注册中心注册自己提供的服务

3)服务消费者在启动时,想注册中心订阅自己所需的服务

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

4)服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另外一台调用。

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


2、Dubbo 注册中心

dubbo 支持四中不同的注册中心:Zookeeper、Redis、Muticast、Simple。推荐使用 Zookeeper。

ubbo里默认使用zkclient来操作zookeeper服务器,其对zookeeper原始客户单做了一定的封装,操作zookeeper时能便捷一些,比如不需要手动处理session超时,不需要重复注册watcher等等。

1)下载安装 Zookeeper:https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/

2)解压tar -zxvf zookeeper-3.4.11.tar.gz

3)移动至指定位置并改名为 zookeeper

mv zookeeper-3.4.11 /usr/local/zookeeper

4)配置 zookeeper:初始化 zookeeper 配置文件

拷贝 /usr/local/zookeeper/conf/zoo_sample.cfg 到同一个目录下,改名为 zoo.cfg

5)启动 zookeeper

./zkServer start 启动

./zkServer stop 停止

./zkServer status 当前状态

./zkSever restart 重启

3、安装 dubbo-admin 管理控制台

旧版 dubbo-admin 是 war,新版为 jar 可直接运行,不需要放置到 tomcat 中

可以看到 dubbo-admin 管理后台

4、Dubbo 简单工程示例

1)公共接口层

包含了抽象接口类及公用的 pojo 类

UserRpcService类

public interface UserRpcService {
UserDTO get(Integer id);
}

pojo类

public class UserDTO implements Serializable {

/**
    * 用户编号
    */
   private Integer id;
   /**
    * 昵称
    */
   private String name;
   /**
    * 性别
    */
   private Integer gender;
}

注意由于是远程接口调用,需要 pojo 类实现序列化

2)服务提供者

该模块需要引用公共的 api 接口模块及 dubbo 的自动化配置依赖(包括 zookeeper 注册中心

<dependency>
   <groupId>com.gerry.dubbodemo</groupId>
   <artifactId>service-api</artifactId>
   <version>1.0-SNAPSHOT</version>
</dependency>
<!-- 实现对 Dubbo 的自动化配置 -->
<dependency>
   <groupId>org.apache.dubbo</groupId>
   <artifactId>dubbo</artifactId>
   <version>2.7.4.1</version>
</dependency>
<dependency>
   <groupId>org.apache.dubbo</groupId>
   <artifactId>dubbo-spring-boot-starter</artifactId>
   <version>2.7.4.1</version>
</dependency>

<!-- 使用 Zookeeper 作为注册中心 -->
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-framework</artifactId>
   <version>2.13.0</version>
</dependency>
<dependency>
   <groupId>org.apache.curator</groupId>
   <artifactId>curator-recipes</artifactId>
   <version>2.13.0</version>
</dependency>

工程结构如下:

接口实现类

@Service
public class UserRpcServiceImpl implements UserRpcService {
@Override
   public UserDTO get(Integer id) {
return new UserDTO().setId(id)
.setName("没有昵称:"+id)
.setGender(id%2+1);
   }
}

实现抽象接口,并交给 spring 容器进行管理

appplication.yml 配置:

dubbo:
application:
name: service-provider
registry:
address: zookeeper://your zookeeper ip:2181
protocol:
port: -1
   name: dubbo
provider:
timeout: 1000
   UserRpcService:
version: 1.0.0

配置 dubbo.xml 对该接口的实现类进行暴露

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
      xmlns="http://www.springframework.org/schema/beans"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://dubbo.apache.org/schema/dubbo
      http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

   <!-- 服务提供者暴露服务配置 -->
   <dubbo:service ref="userRpcServiceImpl" interface="com.gerry.dubbo.api.UserRpcService"
                  version="${dubbo.provider.UserRpcService.version}" />

启动服务提供者 ProviderApplication(这里需要引用 dubbo.xml 配置文件到容器中)

@SpringBootApplication
@ImportResource("classpath:dubbo.xml")
public class ProviderApplication {
public static void main(String[] args){
    SpringApplication.run(ProviderApplication.class);
   }
}

可以看到 dubbo-admin后台服务已经注册到注册中心了,名称为 com.gerry.dubbo.api.UserRpcService 版本号为 1.0.0

3)服务消费者

同样需要对 dubbo 进行依赖(包括 zookeeper 注册中心)

<dependencies>
   <!-- 引入 Spring Boot 依赖 -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter</artifactId>
   </dependency>
   <dependency>
       <groupId>com.gerry.dubbodemo</groupId>
       <artifactId>service-api</artifactId>
       <version>1.0-SNAPSHOT</version>
   </dependency>
   <!-- 实现对 Dubbo 的自动化配置 -->
   <dependency>
       <groupId>org.apache.dubbo</groupId>
       <artifactId>dubbo</artifactId>
       <version>2.7.4.1</version>
   </dependency>
   <dependency>
       <groupId>org.apache.dubbo</groupId>
       <artifactId>dubbo-spring-boot-starter</artifactId>
       <version>2.7.4.1</version>
   </dependency>

   <!-- 使用 Zookeeper 作为注册中心 -->
   <dependency>
       <groupId>org.apache.curator</groupId>
       <artifactId>curator-framework</artifactId>
       <version>2.13.0</version>
   </dependency>
   <dependency>
       <groupId>org.apache.curator</groupId>
       <artifactId>curator-recipes</artifactId>
       <version>2.13.0</version>
   </dependency>
</dependencies>

工程结构如下:

application.yml 配置:

dubbo:
application:
name: service-consumer
registry:
address: zookeeper://your zookeeper ip:2181
consumer:
timeout: 1000
   UserRpcService:
version: 1.0.0

dubbo 配置文件:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
      xmlns="http://www.springframework.org/schema/beans"
      xsi:schemaLocation="http://www.springframework.org/schema/beans
      http://www.springframework.org/schema/beans/spring-beans.xsd
      http://dubbo.apache.org/schema/dubbo
      http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

   <!-- 服务消费者引用服务配置 -->
   <dubbo:reference id="userService" interface="com.gerry.dubbo.api.UserRpcService"
                    version="${dubbo.consumer.UserRpcService.version}" validation="false" />

</beans>

声明服务引用 reference  交给 spring 容器:

@SpringBootApplication
@ImportResource("classpath:dubbo.xml")
public class ConsumerApplication {
public static void main(String[] args) {
// 启动 Spring Boot 应用
       ConfigurableApplicationContext context = SpringApplication.run(ConsumerApplication.class, args);
   }

   @Component
   public class UserRpcServiceTest implements CommandLineRunner {

private final Logger logger = LoggerFactory.getLogger(getClass());

       @Resource
       private UserRpcService userRpcService;

       @Override
       public void run(String... args) throws Exception {
           UserDTO user = userRpcService.get(1);
           logger.info("[run][发起一次 Dubbo RPC 请求,获得用户为({})", user);
       }
   }
}

直接通过 userRpcService 实例调用方法

启动 ConsumerApplication 类,可以看到 dubbo-admin 注册中心里面消费者的信息

同时控制台打印了调用服务者的相关信息

这个用户信息正是服务提供者提供的

明天计划的事情:

1、dubbo 注解配置及其他知识点学习

遇到的问题:

暂无


返回列表 返回列表
评论

    分享到