基于Dubbo实现微服务架构项目
学习一种新技术的时候,先去官网学习。不要着急看视频
安装jar到本地仓库的时候,有的时候会出错 原因1.jar包位置出错 2.w10系统打开cmd的是时候 有的时候是以powerShell窗口
1. 基于Dubbo的微服务体系概述
Dubbo
- 阿里巴巴开源的一个RPC(远程过程调用)框架
- 基于此框架+一系列的第三方组件 可以实现一套微服务架构体系
- 后期阿里巴巴闭源了,由当时的使用者(当当网)自行维护 -> dubbox
- 再后期阿里巴巴在决策之后,将其捐赠给了Apache基金会,Apache顶级孵化项目
- 经过大约2年时间的孵化,目前已经第一版GA (http://dubbo.apache.org/zh-cn/)
Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用----不同的机器,智能容错和负载均衡,以及服务自动注册和发现。
一般我们是结合着zookeeper(Apahce的一个组件)来实现服务的注册中心这种能力。
2. 掌握基于Dubbo的微服务体系的原理
当容器启动之后(初始化):
-
1.服务的provider会向注册中心注册自己能够提供的服务(能力)
-
2.服务的consumer会向注册中心订阅自己需要的服务
-
3.异步的通知(notify)服务的consumer对应的服务provider信息(接口方法、主机地址等信息)
-
4.服务的consumer在得知了对应的provider信息之后可以进行服务的远程调用(Dubbo)
-
5.服务的consumer和provider会异步的将信息统计给对应的Monitor。
ontainer服务器
async异步请求
3. 掌握微服务环境的搭建
Zookeeper端口默认 2181
zookeeper的启动:
- 搭建Zookeeper作为注册中心(Registry)
- 搭建DubboAdmin作为可视化UI 监测Zookeeper的注册和订阅等情况
- 我们不采用纯Spring配置文件形式来导入Dubbo,我们采用SpringBoot来实现(纯注解和自动配置)
- 安装了SpringBootStarter(Dubbo)
4. 掌握微服务项目的搭建
微服务中将各个模块拆分的基础上,又进行消费者和提供者的划分。
用户模块、订单模块、商品模块、…
-
模块消费者:此模块需要消费服务(其他模块)的内容 类似于controller
-
模块提供者:此模块可以提供给消费者(其他模块)的内容 类似于service dao…
4.1 准备RPC调用的关键-服务接口(公共的服务接口)
自行创建项目,创建一个接口作为服务接口。
它需要被provider项目和consumer项目同时依赖。
provider项目实现此服务接口。
consumer项目通过此服务接口调用远程的provider项目内容。
qg-commons-service:
/**
* 示例接口:(远程服务<不同的服务器<机器>内的项目>调用)
* 服务提供者(Provider)需要实现此接口
* 服务消费者(Consumer)需要通过此接口来进行远程调用提供者
*/
public interface DemoService {
/**
* 返回Hello {name}!
* @param name
* @return
*/
String sayHello(String name)throws Exception;
}
4.2 provider项目搭建
- 1.导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Zookeeper相关 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.13.0</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- Dubbo相关 -->
<dependency>
<groupId>com.alibaba.hl</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.7</version>
</dependency>
<!-- 公共接口 -->
<dependency>
<groupId>cn.qg</groupId>
<artifactId>qg-commons-service</artifactId>
<version>1.0-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
</dependencies>
-
2.实现服务接口,并且暴露服务
@Component @Service(interfaceClass = DemoService.class) // 提供用于向注册中心注册的服务信息(暴露) /* <!-- 声明需要暴露的服务接口 --> <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService" /> <!-- 和本地bean一样实现服务 --> <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl" /> */ public class DemoServiceImpl implements DemoService { @Override public String sayHello(String name) throws Exception { return "Hello "+name; } }
-
3.更改配置文件指定注册中心等信息
server: port: 9091 # 配置节点信息和注册中心信息 spring: dubbo: # 注册的节点名(唯一) appname: qg-demo-provider # 注册中心 registry: zookeeper://127.0.0.1:2181 # 服务提供者占用的端口 port: 20800 # 等价于下方 # <!-- 提供方应用信息,用于计算依赖关系 --> # <dubbo:application name="hello-world-app" /> # # <!-- 使用multicast广播注册中心暴露服务地址 --> # <dubbo:registry address="multicast://224.5.6.7:1234" /> # # <!-- 用dubbo协议在20880端口暴露服务 --> # <dubbo:protocol name="dubbo" port="20880" />
-
4.启用Dubbo配置
@EnableDubboConfiguration // 启用Dubbo配置 @SpringBootApplication public class QgDemoProviderApplication { public static void main(String[] args) { SpringApplication.run(QgDemoProviderApplication.class,args); } }
4.3 consumer项目搭建
-
导入依赖
-
指定需要调用的服务接口
@RestController public class DemoController { /* <!-- 生成远程服务代理,可以和本地bean一样使用demoService --> <dubbo:reference id="demoService" interface="org.apache.dubbo.demo.DemoService" /> */ @DubboConsumer // Dubbo的远程调用注解 消费者会根据配置去查找此服务 private DemoService demoService; @GetMapping("/demo/{name}") public String doDemo(@PathVariable String name) throws Exception { return demoService.sayHello(name); } }
-
指定注册中心信息
server: port: 9092 # 配置节点信息和注册中心信息 spring: dubbo: # 注册的节点名(唯一) appname: qg-demo-consumer # 注册中心 registry: zookeeper://127.0.0.1:2181 #<!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 --> #<dubbo:application name="consumer-of-helloworld-app" /> # #<!-- 使用multicast广播注册中心暴露发现服务地址 --> #<dubbo:registry address="multicast://224.5.6.7:1234" />
-
启用Dubbo配置
4.4 微服务项目的调用
-
先启动Provider
-
再启动Consumer
-
调用Consumer功能,会经由Dubbo来进行远程的RPC调用