dubbo + zookeeper + spring Boot框架整合与dubbo泛型调用演示3

本文涉及的产品
注册配置 MSE Nacos/ZooKeeper,118元/月
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
简介: dubbo + zookeeper + spring Boot框架整合与dubbo泛型调用演示

父项目pom.xml如下

 

 

<?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>org.apache.dubbo</groupId>

   <artifactId>dubboDemo</artifactId>

   <version>1.0-SNAPSHOT</version>

   <modules>

       <module>dubbo-demo-api</module>

       <module>dubbo-demo-provider</module>

       <module>dubbo-demo-consumer</module>

   </modules>

 

   <!--设置打包类型为pom,目的是为了实现多模块项目-->

   <packaging>pom</packaging>

 

</project>

 

dubbo-demo-api模块编码

如下,在java源码根目录下新建层级Package,然后右键demo包-> New -> Java Class,新建DemoService.java源文件,代码如下

package org.apache.dubbo.demo;

 

public interface DemoService {

   String sayHello(String name);

}

 

 

dubbo-demo-provider模块编码与配置

新建DemoServiceImpl.java源文件,代码内容如下

package org.apache.dubbo.demo.provider;

import org.apache.dubbo.demo.DemoService;

 

public class DemoServiceImpl implements DemoService {

   public String sayHello(String name) {

       return "Hello " + name;

   }

}

 

新建Provider.java源文件

package org.apache.dubbo.demo.provider;

import org.springframework.context.support.ClassPathXmlApplicationContext;

 

public class Provider {

 

   /**

    * To get ipv6 address to work, add

    * System.setProperty("java.net.preferIPv6Addresses", "true");

    * before running your application.

    */

   public static void main(String[] args) throws Exception {

       ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"META-INF/spring/provider.xml"});

       context.start();

       System.in.read(); // press any key to exit

   }

}

 

新建provider.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-4.3.xsd

      http://dubbo.apache.org/schema/dubbohttp://dubbo.apache.org/schema/dubbo/dubbo.xsd">

 

   <!-- 提供方应用名称,用于跟踪依赖关系(provider's application name, used for tracing dependency relationship -->

   <dubbo:application name="demo-provider"/>

 

   <!-- 使用multicast广播注册中心暴露服务地址(use multicast registry center to export service -->

   <dubbo:registry address="zookeeper://192.168.31.192:2181"/>

   <!-- 用dubbo协议在20880端口暴露服务(use dubbo protocol to export service on port 20880 -->

   <dubbo:protocol name="dubbo" port="20880"/>

   <!-- 和本地bean一样实现服务(service implementation, as same as regular local bean -->

   <bean id="demoService" class="org.apache.dubbo.demo.provider.DemoServiceImpl"/>

   <!-- 声明需要暴露的服务接口(declare the service interface to be exported -->

   <dubbo:service interface="org.apache.dubbo.demo.DemoService" ref="demoService"/>

</beans>

注意:这里class和interface均需要携带包名,否则可能会提示类似以下错误

java.lang.ClassNotFoundException: DemoServiceImpl

 

 

如下,实践过程发现,provider.xml会提示以下错误:

URI is not registered (Settings | Languages & Frameworks | Schemas and DTDs)

 

 

 

解决方法:

File -> Settings -> Languages & Frameworks -> Schemas and DTDS,点击右侧+号,添加URL http://dubbo.apache/schema/dubbo

 

 

 

添加后效果如下

 

 

 

修改模块的pom.xml文件,增加依赖(以下加粗倾斜部分)

<?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">

   <parent>

       <artifactId>dubboDemo</artifactId>

       <groupId>org.apache.dubbo</groupId>

       <version>1.0-SNAPSHOT</version>

   </parent>

   <modelVersion>4.0.0</modelVersion>


   <artifactId>dubbo-demo-provider</artifactId>


   <dependencies>
       <dependency>
           <artifactId>dubbo-demo-api</artifactId>
           <groupId>org.apache.dubbo</groupId>
           <version>1.0-SNAPSHOT</version>
       </dependency>
   </dependencies>
</project>

 

 

配置日志系统,新建log4j.propertities,内容如下

###set log levels###

log4j.rootLogger=info, stdout

###output to the console###

log4j.appender.stdout=org.apache.log4j.ConsoleAppender

log4j.appender.stdout.Target=System.out

log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

log4j.appender.stdout.layout.ConversionPattern=[%d{dd/MM/yy hh:mm:ss:sss z}] %t %5p %c{2}: %m%n

 

至此,项目代码结构如下

 

 

运行Provider

 

浏览器访问,查看服务

 

 

 

 

 

dubbo-dubbo-consumer模块编码

新建Consumer.java源文件及对应包

package org.apache.dubbo.demo.consumer;

 

import org.springframework.context.support.ClassPathXmlApplicationContext;

import org.apache.dubbo.demo.DemoService;

import com.alibaba.dubbo.rpc.service.GenericService;

 

public class Consumer {

   public static void main(String[] args) throws Exception {

       ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"META-INF/spring/consumer.xml"});

       context.start();

       // Obtaining a remote service proxy

       DemoService demoService = (DemoService)context.getBean("demoService");

       // Executing remote methods

       String hello = demoService.sayHello("world");

       // Display the call result

       System.out.println(hello);

 

       

   }

}

 

 

修改模块的pom.xml文件,增加依赖(以下加粗倾斜部分)

<?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">

   <parent>

       <artifactId>dubboDemo</artifactId>

       <groupId>org.apache.dubbo</groupId>

       <version>1.0-SNAPSHOT</version>

   </parent>

   <modelVersion>4.0.0</modelVersion>

 

   <artifactId>dubbo-demo-consumer</artifactId>

 

   <dependencies>

       <dependency>

           <artifactId>dubbo-demo-api</artifactId>

           <groupId>org.apache.dubbo</groupId>

           <version>1.0-SNAPSHOT</version>

       </dependency>

   </dependencies>

 

</project>

 

 

新增consumer.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-4.3.xsd

      http://dubbo.apache.org/schema/dubbohttp://dubbo.apache.org/schema/dubbo/dubbo.xsd">

 

   <!-- 消费者应用名称,用于跟踪依赖关系(不是匹配条件,不要和提供方应用名称一样 consumer's application name, used for tracing dependency relationship (not a matching criterion),

   don't set it same as provider -->

   <dubbo:application name="demo-consumer"/>

   <!-- 使用multicast广播注册中心发现服务地址use multicast registry center to discover service -->

   <!--<dubbo:registry address="multicast://224.5.6.7:1234"/>-->

   <dubbo:registry address="zookeeper://192.168.31.192:2181"/>

   <!-- 生成远程服务代理,这样便可以和本地bean一样使用demoService(generate proxy for the remote service, then demoService can be used in the same way as the

   local regular interface -->

   <dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService"/>

</beans>

 

 

新增log4j.propertities文件,内容同上

 

项目模块代码结构如下:

 

 

 

 

运行Consumer

 

 

 

浏览器访问http://192.168.31.192:7001/governance/consumers,查看消费者,结果看不到消费者

 

替换以下代码

String hello = demoService.sayHello("world");

// Display the call result

System.out.println(hello);

 

为下方代码

 

while (true) {

   String hello = demoService.sayHello("world");

   System.out.println(hello);

}

 

再次查看,结果如下

 

 

参考链接

http://dubbo.apache.org/en-us/docs/user/quick-start.html

 

 

Dubbo特性-泛型调用

依赖spring配置文件的泛型调用

修改consumer.xml配置文件,找到以下内容行,新增generic="true",表示该接口支持泛型调用

<dubbo:reference id="demoService" check="false" interface="org.apache.dubbo.demo.DemoService" generic="true"/>

 

修改Consumer.java如下

package org.apache.dubbo.demo.consumer;

 

import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.alibaba.dubbo.rpc.service.GenericService;

 

public class Consumer {

   public static void main(String[] args) throws Exception {

       ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"META-INF/spring/consumer.xml"});

       context.start();

     

// Spring 泛化调用

GenericService demoService = (GenericService) context.getBean("demoService");

Object result = demoService.$invoke("sayHello", new String[] {"java.lang.String"} , new Object[] {"world"});

System.out.println(result);

 

   }

}

 

说明:

$invoke方法有三个参数,第一个参数是调用的远程接口的具体方法名称(例中为sayHello),第二个参数是所调用方法的入参类型,第三个是参数值。

不依赖Spring配置文件的泛型调用

修改Consumer.java文件

package org.apache.dubbo.demo.consumer;

 

import com.alibaba.dubbo.config.ApplicationConfig;

import com.alibaba.dubbo.config.ReferenceConfig;

import com.alibaba.dubbo.config.RegistryConfig;

import com.alibaba.dubbo.config.utils.ReferenceConfigCache;

import com.alibaba.dubbo.rpc.service.GenericService;

 

 

public class Consumer {

   public static void main(String[] args) {

 

       //设置消费者应用名称

       ApplicationConfig application =  new ApplicationConfig();

       application.setName("dubbo-consumer");

 

       //设置连接注册中心地址(zookeeper访问地址)

       RegistryConfig registry = new RegistryConfig();

       registry.setAddress("zookeeper://192.168.31.192:2181");

 

       ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();

       reference.setApplication(application);

       reference.setRegistry(registry);

       reference.setInterface("org.apache.dubbo.demo.DemoService");

       reference.setGeneric(true); // 声明为泛化接口

 

       ReferenceConfigCache cache = ReferenceConfigCache.getCache();

       GenericService genericService = cache.get(reference);

 

       Object result = genericService.$invoke("sayHello", new String[] {"java.lang.String"}, new Object[]{"world"});

       System.out.println(result);

 

   }

}

 

泛型调用-传递更复杂的参数类型

在dubbo-demo-api模块下新增dto Package,并在该包下新增QueryUserInfoReq.java源文件,内容如下

package org.apache.dubbo.demo.dto;


import java.io.Serializable;

import java.util.List;


public  class QueryUserInfoReq implements Serializable

{

   private static final long serialVersionUID = 1L;

   private String name;

   private String age;

   private List<String> hobbyList;



   public String getName() {

       return this.name;

   }


   public void setName(String name) {

       this.name = name;

   }


   public String getAge() {

       return this.age;

   }


   public void setAge(String age) {

       this.age = age;

   }


   public List<String> getHobbyList() {

       return this.hobbyList;

   }


   public void setHobbyList(List<String> hobbyList) {

       this.hobbyList = hobbyList;

   }


   public String toString()

   {

       return "QueryUserInfoReq{name='" + this.name + '\'' + ", age='" + this.age + '\'' + ", hobbyList=" + this.hobbyList + '}';

   }

}

 

 

修改dubbo-demo-api模块下的DemoService.java文件,增加QueryUserInfo方法

package org.apache.dubbo.demo;


import org.apache.dubbo.demo.dto.QueryUserInfoReq;


public interface DemoService {

   String sayHello(String name);


   String QueryUserInfo(QueryUserInfoReq userInfo);

}

 

修改dubbo-demo-provider模块下DemoServiceImpl.java文件,增加QueryUserInfo方法实现

package org.apache.dubbo.demo.provider;

import org.apache.dubbo.demo.DemoService;

import org.apache.dubbo.demo.dto.QueryUserInfoReq;


public class DemoServiceImpl implements DemoService {

   public String sayHello(String name) {

       return "Hello " + name;

   }


   public  String QueryUserInfo(QueryUserInfoReq userInfo){
       return userInfo.toString();
   }

}

 

 

这里为了增加对dubbo认识和理解,单独为消费者新建了一个不带架构模板的maven项目,项目代码结构如下

 

 

 

Consumber.java如下

import com.alibaba.dubbo.config.ApplicationConfig;

import com.alibaba.dubbo.config.ReferenceConfig;

import com.alibaba.dubbo.config.RegistryConfig;

import com.alibaba.dubbo.config.utils.ReferenceConfigCache;

import com.alibaba.dubbo.rpc.service.GenericService;


import java.util.HashMap;

import java.util.Map;


import java.util.List;

import java.util.ArrayList;


public class Consumer {

   public static void main(String[] args) {


       //设置消费者应用名称

       ApplicationConfig application =  new ApplicationConfig();

       application.setName("dubbo-consumer");


       //设置连接注册中心地址

       RegistryConfig registry = new RegistryConfig();


       registry.setAddress("zookeeper://192.168.31.192:2181");


       ReferenceConfig<GenericService> reference = new ReferenceConfig<GenericService>();

       reference.setApplication(application);

       reference.setRegistry(registry);


       reference.setInterface("org.apache.dubbo.demo.DemoService");


       reference.setTimeout(5000); // 设置超时间为5秒

       reference.setRetries(1);    // 设置重试次数

       reference.setGeneric(true); // 声明为泛化接口


       ReferenceConfigCache cache = ReferenceConfigCache.getCache();

       GenericService genericService = cache.get(reference);


       Map<String,Object> map = new HashMap<String,Object>();

       map.put("name","shouke");

       List<String> l = new ArrayList<String>();

       l.add("pingpong");

       l.add("basketball");

       map.put("hobbyList",l);

       map.put("age","99");

       Object result = genericService.$invoke("QueryUserInfo", new String[] {"org.apache.dubbo.demo.dto.QueryUserInfoReq"},new Object[]{map});

       System.out.println(result);


   }

}

 

注意:参数类型需要把其所在包也写上,否则会提示找不到类

java.lang.ClassNotFoundException: QueryUserInfoReq

 

pom.xml内容如下

<?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>org.apache.dubbo</groupId>

   <artifactId>dubbo-consumer</artifactId>

   <version>1.0-SNAPSHOT</version>


   <properties>

       <maven.compiler.source>1.8</maven.compiler.source>

       <maven.compiler.target>1.8</maven.compiler.target>

       <dubbo.version>2.6.2</dubbo.version>

       <zkclient.version>0.10</zkclient.version>

       <curator-client.version>2.8.0</curator-client.version>

       <curator-framework.version>2.8.0</curator-framework.version>

   </properties>


   <dependencies>

       <!-- dubbo 依赖 -->

       <dependency>

           <groupId>com.alibaba</groupId>

           <artifactId>dubbo</artifactId>

           <version>${dubbo.version}</version>

       </dependency>

       <!-- zookeeper 客户端依赖 -->

       <dependency>

            <groupId>com.101tec</groupId>

            <artifactId>zkclient</artifactId>

            <version>${zkclient.version}</version>

       </dependency>

       <dependency>

           <groupId>org.apache.curator</groupId>

           <artifactId>curator-client</artifactId>

           <version>${curator-client.version}</version>

       </dependency>

       <dependency>

           <groupId>org.apache.curator</groupId>

           <artifactId>curator-framework</artifactId>

           <version>${curator-framework.version}</version>

       </dependency>

   </dependencies>

</project>

 

 

运行Consumer

 

参考链接

https://www.cnblogs.com/flyingeagle/p/8908317.html

 

点击以下链接查看详情(压缩文件包含工程代码):

dubbo +zookeeper +spring Boot框架整合与dubbo泛型调用演示

 

 

相关实践学习
基于MSE实现微服务的全链路灰度
通过本场景的实验操作,您将了解并实现在线业务的微服务全链路灰度能力。
目录
相关文章
|
10天前
|
安全 应用服务中间件 API
微服务分布式系统架构之zookeeper与dubbo-2
微服务分布式系统架构之zookeeper与dubbo-2
|
21天前
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
21天前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
11天前
|
人工智能 开发框架 Java
重磅发布!AI 驱动的 Java 开发框架:Spring AI Alibaba
随着生成式 AI 的快速发展,基于 AI 开发框架构建 AI 应用的诉求迅速增长,涌现出了包括 LangChain、LlamaIndex 等开发框架,但大部分框架只提供了 Python 语言的实现。但这些开发框架对于国内习惯了 Spring 开发范式的 Java 开发者而言,并非十分友好和丝滑。因此,我们基于 Spring AI 发布并快速演进 Spring AI Alibaba,通过提供一种方便的 API 抽象,帮助 Java 开发者简化 AI 应用的开发。同时,提供了完整的开源配套,包括可观测、网关、消息队列、配置中心等。
554 6
|
9天前
|
XML 前端开发 Java
控制spring框架注解介绍
控制spring框架注解介绍
|
9天前
|
存储 NoSQL Java
Spring Session框架
Spring Session 是一个用于在分布式环境中管理会话的框架,旨在解决传统基于 Servlet 容器的会话管理在集群和云环境中的局限性。它通过将用户会话数据存储在外部介质(如数据库或 Redis)中,实现了会话数据的跨服务器共享,提高了应用的可扩展性和性能。Spring Session 提供了无缝集成 Spring 框架的 API,支持会话过期策略、并发控制等功能,使开发者能够轻松实现高可用的会话管理。
Spring Session框架
|
16天前
|
Java 应用服务中间件 开发者
深入探索并实践Spring Boot框架
深入探索并实践Spring Boot框架
27 2
|
16天前
|
机器学习/深度学习 数据采集 JavaScript
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
ADR药品不良反应监测系统是一款智能化工具,用于监测和分析药品不良反应。该系统通过收集和分析病历、处方及实验室数据,快速识别潜在不良反应,提升用药安全性。系统采用Java开发,基于SpringBoot框架,前端使用Vue,具备数据采集、清洗、分析等功能模块,并能生成监测报告辅助医务人员决策。通过集成多种数据源并运用机器学习算法,系统可自动预警药品不良反应,有效减少药害事故,保障公众健康。
ADR智能监测系统源码,系统采用Java开发,基于SpringBoot框架,前端使用Vue,可自动预警药品不良反应
|
25天前
|
运维 NoSQL Java
SpringBoot接入轻量级分布式日志框架GrayLog技术分享
在当今的软件开发环境中,日志管理扮演着至关重要的角色,尤其是在微服务架构下,分布式日志的统一收集、分析和展示成为了开发者和运维人员必须面对的问题。GrayLog作为一个轻量级的分布式日志框架,以其简洁、高效和易部署的特性,逐渐受到广大开发者的青睐。本文将详细介绍如何在SpringBoot项目中接入GrayLog,以实现日志的集中管理和分析。
104 1
|
29天前
|
缓存 Java 应用服务中间件
随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架
【9月更文挑战第6天】随着微服务架构的兴起,Spring Boot凭借其快速开发和易部署的特点,成为构建RESTful API的首选框架。Nginx作为高性能的HTTP反向代理服务器,常用于前端负载均衡,提升应用的可用性和响应速度。本文详细介绍如何通过合理配置实现Spring Boot与Nginx的高效协同工作,包括负载均衡策略、静态资源缓存、数据压缩传输及Spring Boot内部优化(如线程池配置、缓存策略等)。通过这些方法,开发者可以显著提升系统的整体性能,打造高性能、高可用的Web应用。
58 2
下一篇
无影云桌面