dubbo服务简单搭建
一、初识dubbo:
架构图:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
流程:
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
注册中心选择:
dubbo支持多种类型的注册中心:
- Multicast注册中心
- Zookeeper注册中心
- Redis注册中心
- Simple注册中心
二、ZooKeeper
下载:https://archive.apache.org/dist/zookeeper/
windows安装:https://blog.csdn.net/tlk20071/article/details/52028945
三、服务Demo搭建
1、新建一个maven工程:结构如下
其中模块dubbo-api用于给提供服务模块dubbo-provider和消费服务dubbo-cosumer提供公用接口,各目录结构为:
模块dubbo-api简单测试代码如下:
- package com.example.demo;
- public interface DemoService {
- String testService();
- }
提供服务模块dubbo-provider:
pom文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.example</groupId>
- <artifactId>dubbo-provider</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>dubbo-provider</name>
- <description>Demo project for Spring Boot</description>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.0.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <java.version>1.8</java.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- <!-- dubbo-api依赖 -->
- <dependency>
- <groupId>com.example</groupId>
- <artifactId>dubbo-api</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- </dependency>
- <!-- dubbo依赖 -->
- <dependency>
- <groupId>com.alibaba</groupId>
- <artifactId>dubbo</artifactId>
- <version>2.4.10</version>
- <exclusions>
- <exclusion>
- <artifactId>spring</artifactId>
- <groupId>org.springframework</groupId>
- </exclusion>
- </exclusions>
- </dependency>
- <!-- zkclient -->
- <dependency>
- <groupId>com.101tec</groupId>
- <artifactId>zkclient</artifactId>
- <version>0.3</version>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
实现接口类:
- package com.example.demo.impl;
- import com.example.demo.DemoService;
- public class DemoServiceimpl implements DemoService {
- @Override
- public String testService() {
- return "provider testService";
- }
- }
启动类:
- package com.example.demo.provider;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- import java.io.IOException;
- public class Provider {
- public static void main(String[] args) {
- ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
- "classpath*:provider.xml");
- context.start();
- System.out.println("dubbo service begin to start");
- try {
- System.in.read();
- } catch (IOException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
配置文件:
- <?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-admin 或 dubbo-monitor 会显示这个名字,方便辨识-->
- <dubbo:application name="demo-provider" owner="programmer" organization="dubbox"/>
- <!--使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper-->
- <dubbo:registry address="zookeeper://localhost:2181"/>
- <!-- 用dubbo协议在20880端口暴露服务 -->
- <dubbo:protocol name="dubbo" port="20880" />
- <!--使用 dubbo 协议实现定义好的 api.PermissionService 接口-->
- <dubbo:service interface="com.example.demo.DemoService" ref="demoService" protocol="dubbo" />
- <!--具体实现该接口的 bean-->
- <bean id="demoService" class="com.example.demo.impl.DemoServiceimpl"/>
- </beans>
消费服务dubbo-cosumer:
pom文件:
- <?xml version="1.0" encoding="UTF-8"?>
- <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- <modelVersion>4.0.0</modelVersion>
- <groupId>com.example</groupId>
- <artifactId>dubbodemo</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <packaging>jar</packaging>
- <name>dubbodemo</name>
- <description>Demo project for Spring Boot</description>
- <parent>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-parent</artifactId>
- <version>2.0.0.RELEASE</version>
- <relativePath/> <!-- lookup parent from repository -->
- </parent>
- <properties>
- <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
- <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
- <java.version>1.8</java.version>
- </properties>
- <dependencies>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-web</artifactId>
- </dependency>
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-test</artifactId>
- <scope>test</scope>
- </dependency>
- </dependencies>
- <build>
- <plugins>
- <plugin>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-maven-plugin</artifactId>
- </plugin>
- </plugins>
- </build>
- </project>
启动类:
- package com.example.demo.consumer;
- import com.example.demo.DemoService;
- import org.springframework.context.support.ClassPathXmlApplicationContext;
- public class Consumer {
- public static void main(String[] args) {
- //测试服务
- ClassPathXmlApplicationContext context =
- new ClassPathXmlApplicationContext("consumer.xml");
- context.start();
- System.out.println("consumer start");
- DemoService demoService = context.getBean(DemoService.class);
- System.out.println("consumer");
- System.out.println(demoService.testService());
- }
- }
配置文件:
- <?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:application name="demo-consumer" owner="programmer" organization="dubbox"/>
- <!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->
- <dubbo:registry address="zookeeper://localhost:2181"/>
- <!--使用 dubbo 协议调用定义好的 api.PermissionService 接口-->
- <dubbo:reference id="demoService" interface="com.example.demo.DemoService"/>
- </beans>
四、测试:
zookeeper服务启动后,先启动服务提供方dubbo-provider,再运行dubbo-consuner,效果如下: