发表于: 2020-02-26 19:20:53
3 1148
啥也不说就是干!!
今天完成的事情:
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 注解配置及其他知识点学习
遇到的问题:
暂无
评论