Dubbo的两种常规启动方式_java

本案例是dubbo版本:2.7.4.1 org.apache.dubbo

建一个工程为dubbo-demo,再创建三个module

dubbo-user-apidubbo-user-providerdubbo-user-consumer

Dubbo的两种常规启动方式_java_02

dubbo-user-api

Dubbo的两种常规启动方式_java_03

DemoService.java接口

package com.tian.dubbo.service;public interface DemoService {   String test(String string);}

然后打成jar给dubbo-user-providerdubbo-user-consumer使用

mvn clean install

dubbo-user-api.jar


启动zookeeper

本地启动一个zookeepeer,作为dubbo的注册中心,(dubbo推荐zookeeper为注册中心)

dubbo-user-provider

pom.xml中添加

<build>       <plugins>           <plugin>               <groupId>org.apache.maven.plugins</groupId>               <artifactId>maven-compiler-plugin</artifactId>               <configuration>                   <source>1.8</source>                   <target>1.8</target>               </configuration>           </plugin>       </plugins>   </build>   <properties>       <dubbo.version>2.5.3</dubbo.version>       <spring.version>4.3.6.RELEASE</spring.version>       <java.version>1.8</java.version>       <log4j.version>1.2.17</log4j.version>       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>   </properties>   <dependencies>       <dependency>           <groupId>org.apache.dubbo</groupId>           <artifactId>dubbo</artifactId>           <version>2.7.4.1</version>       </dependency>       <dependency>           <groupId>org.apache.dubbo</groupId>           <artifactId>dubbo-dependencies-zookeeper</artifactId>           <version>2.7.4.1</version>       </dependency>       <dependency>           <artifactId>dubbo-user-api</artifactId>           <groupId>com.tian.dubbo</groupId>           <version>1.0-SNAPSHOT</version>       </dependency>       <dependency>           <groupId>org.springframework</groupId>           <artifactId>spring-core</artifactId>           <version>${spring.version}</version>       </dependency>       <dependency>           <groupId>org.springframework</groupId>           <artifactId>spring-beans</artifactId>           <version>${spring.version}</version>       </dependency>       <dependency>           <groupId>org.springframework</groupId>           <artifactId>spring-context</artifactId>           <version>${spring.version}</version>       </dependency>   </dependencies>

创建一个DemoServiceImpl.java

public class DemoServiceImpl implements DemoService {   @Override   public String test(String msg) {       System.out.println("接收到参数:" + msg);       return "provider:" + msg;   }}

创建启动类ProviderApplication.java

public class ProviderApplication {   private static String zookeeperHost = System.getProperty("zookeeper.address", "127.0.0.1");   public static void main(String[] args) throws Exception {       ServiceConfig<DemoService> service = new ServiceConfig<>();       service.setApplication(new ApplicationConfig("first-dubbo-provider"));       service.setRegistry(new RegistryConfig("zookeeper://" + zookeeperHost + ":2181"));       service.setInterface(DemoService.class);       service.setRef(new DemoServiceImpl());       service.export();       System.out.println("Dubbo server started");       new CountDownLatch(1).await();   }}

启动

输出:Dubbo server started

启动成功,等着消费方调用。下面来说说消费方

dubbo-user-consumer

pom.xml添加

<properties>       <dubbo.version>2.5.3</dubbo.version>       <spring.version>4.3.6.RELEASE</spring.version>       <java.version>1.8</java.version>       <log4j.version>1.2.17</log4j.version>       <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>   </properties>   <dependencies>       <dependency>           <groupId>org.apache.dubbo</groupId>           <artifactId>dubbo</artifactId>           <version>2.7.4.1</version>       </dependency>       <dependency>           <groupId>org.apache.dubbo</groupId>           <artifactId>dubbo-dependencies-zookeeper</artifactId>           <version>2.7.4.1</version>       </dependency>       <dependency>           <artifactId>dubbo-user-api</artifactId>           <groupId>com.tian.dubbo</groupId>           <version>1.0-SNAPSHOT</version>       </dependency>       <dependency>           <groupId>org.springframework</groupId>           <artifactId>spring-core</artifactId>           <version>${spring.version}</version>       </dependency>       <dependency>           <groupId>org.springframework</groupId>           <artifactId>spring-beans</artifactId>           <version>${spring.version}</version>       </dependency>       <dependency>           <groupId>org.springframework</groupId>           <artifactId>spring-context</artifactId>           <version>${spring.version}</version>       </dependency>       <dependency>           <groupId>log4j</groupId>           <artifactId>log4j</artifactId>           <version>${log4j.version}</version>       </dependency>   </dependencies>

Dubbo的两种常规启动方式_java_04

启动类ConsumerApplication.java

启动并调用

输出:provider:dubbo

dubbo-user-provider中输出:接收到参数:dubbo


xml方式

provider

Dubbo的两种常规启动方式_java_05

provider.xml

<?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="provider"/>   <!-- 使用zookeeper注册中心暴露服务地址 -->   <dubbo:registry address="zookeeper://localhost:2181" protocol="zookeeper" check="false"/>   <!-- 用dubbo协议在随机端口暴露服务 -->   <dubbo:protocol id="dubbo" name="dubbo" port="-1" threads="200" />   <!-- 声明需要暴露的服务接口 -->   <dubbo:service interface="com.tian.dubbo.service.DemoService" ref="demoService"/>    <!-- 和本地bean一样实现服务 -->    <bean id="demoService" class="com.tian.dubbo.service.impl.DemoServiceImpl"/></beans>

启动类ProviderApplication.java

public class ProviderApplication {   public static void main(String[] args) throws IOException {       ClassPathXmlApplicationContext context = new                            ClassPathXmlApplicationContext("provider.xml");       System.err.println(context.getDisplayName() + ": here");       context.start();       System.err.println("服务已经启动...");       System.in.read();   }}

log4j.xml

<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE log4j:configuration SYSTEM "log4j.dtd"><log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">   <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">        <layout class="org.apache.log4j.PatternLayout">            <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n" />        </layout>    </appender>    <root>        <level value="INFO" />        <appender-ref ref="CONSOLE" />    </root></log4j:configuration>

启动输出:

Dubbo的两种常规启动方式_java_06

consumer

ConsumerApplication.java

public class ConsumerApplication { public static void main(String[] args) {     //测试常规服务     ClassPathXmlApplicationContext context =             new ClassPathXmlApplicationContext("consumer.xml");     context.start();     System.err.println("consumer start");     DemoService demoService = context.getBean(DemoService.class);     System.out.println(demoService.test("dubbo xml"));}}

consumer.xml

<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="demotest-consumer" owner="programmer" organization="dubbox"/>   <!--向 zookeeper 订阅 provider 的地址,由 zookeeper 定时推送-->   <dubbo:registry address="zookeeper://localhost:2181"/>   <!--使用 dubbo 协议调用定义好的 api.PermissionService 接口-->   <dubbo:reference id="demoService" interface="com.tian.dubbo.service.DemoService"/></beans>

log4j.xml

<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/" debug="false">   <appender name="CONSOLE" class="org.apache.log4j.ConsoleAppender">        <layout class="org.apache.log4j.PatternLayout">            <param name="ConversionPattern" value="[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n" />        </layout>    </appender>    <root>        <level value="INFO" />        <appender-ref ref="CONSOLE" />    </root></log4j:configuration>

Dubbo的两种常规启动方式_java_07

启动输出:

Dubbo的两种常规启动方式_java_08

证明调用成功,再看provider的输出

Dubbo的两种常规启动方式_java_09

自此,一个xml版本的dubbo demo搞定。


注解方式

provider

DemoServiceImpl.java中的@Service使用的是org.apache.dubbo下面的

import com.tian.dubbo.service.DemoService;import org.apache.dubbo.config.annotation.Service;@Servicepublic class DemoServiceImpl implements DemoService {   @Override   public String test(String msg) {       System.out.println("接收到参数:" + msg);       return "provider:" + msg;   }}

启动类

import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;import org.springframework.context.support.ClassPathXmlApplicationContext;import java.io.IOException;@Configuration@EnableDubbo(scanBasePackages = "com.tian.dubbo.service.impl")//扫描添加了@Service的注解@PropertySource("classpath:dubbo-provider.properties")//配置文件的扫描public class ProviderApplication {      public static void main(String[] args) throws IOException {       AnnotationConfigApplicationContext context = new             AnnotationConfigApplicationContext(ProviderApplication.class);       context.start();       System.err.println("服务已经启动...");       System.in.read(); //需要等待   }}

dubbo-provider.properties

dubbo.application.name=annotation-providerdubbo.registry.address=zookeeper://localhost:2181dubbo.protocol.name=dubbodubbo.protocol.port=20880

Dubbo的两种常规启动方式_java_10

启动

Dubbo的两种常规启动方式_java_11

consumer

dubbo-consumer.properties

dubbo.application.name=annotation-consumerdubbo.registry.address=zookeeper://localhost:2181dubbo.consumer.timeout=3000
import com.tian.dubbo.service.DemoService;import org.apache.dubbo.config.annotation.Reference;import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;import org.springframework.context.annotation.AnnotationConfigApplicationContext;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.PropertySource;@Configuration@EnableDubbo(scanBasePackages = "com.tian.dubbo")//启用Dubbo扫描并注入对象@PropertySource("classpath:dubbo-consumer.properties")//扫描配置文件public class ConsumerApplication {      //这里需要使用Dubbo来进行注入   @Reference   DemoService demoService;   public static void main(String[] args) {       AnnotationConfigApplicationContext context = new            AnnotationConfigApplicationContext(ConsumerApplication.class);       ConsumerApplication customer = context.getBean(ConsumerApplication.class);       String say = customer.demoService.test("dubbo annotation");       System.out.println(say);   }}

启动

Dubbo的两种常规启动方式_java_12

调用成功。