基于SpringBoot的Dubbo泛化調(diào)用的實現(xiàn)代碼
Dubbo的泛化調(diào)用不需要引入調(diào)用方的接口,只需要指定接口的全類名,就可以調(diào)用服務(wù),一般用于框架集成。接下來就基于SpringBoot實現(xiàn)了Dubbo的泛化調(diào)用。
1、服務(wù)端定義
1.1 服務(wù)定義及實現(xiàn)
package com.smart.springboot.api;
public interface HelloServiceFacade {
void sayHello();
}
package com.smart.springboot.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.smart.springboot.api.HelloServiceFacade;
/**
* @author : cuantianhou 2020/1/14
*/
@Service(version = "1.0.0",timeout = 20000)
public class HelloService implements HelloServiceFacade {
@Override
public void sayHello() {
System.out.println("123");
}
}
1.2 服務(wù)提供者配置
package com.smart.springboot.config;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.MonitorConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author : cuantianhou 2020/4/1
*/
@Configuration
public class DubboServiceConfig {
@Bean
public ApplicationConfig applicationConfig(){
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setId("springboot-dubbo-provider");
applicationConfig.setName("springboot-dubbo-provider");
return applicationConfig;
}
@Bean
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setPort(20880);
protocolConfig.setName("dubbo");
return protocolConfig;
}
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://ip1:2181?backup=ip2:2181");
registryConfig.setCheck(false);
return registryConfig;
}
@Bean
public MonitorConfig monitorConfig() {
MonitorConfig monitorConfig = new MonitorConfig();
monitorConfig.setProtocol("registry");
return monitorConfig;
}
}
1.3 啟動類
package com.smart.springboot;
import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 啟動類
*
* @author : cuantianhou 2020/1/14
*/
@SpringBootApplication
@DubboComponentScan("com.smart.springboot")
public class SpringBootDubboProvider {
public static void main(String[] args) {
SpringApplication.run(SpringBootDubboProvider.class,args);
}
}
1.4 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.smart.springboot</groupId>
<artifactId>springboot-dubbo-provider</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!--引入dubbo環(huán)境-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
<dependency>
<groupId>com.smart.springboot</groupId>
<artifactId>springboot-dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
2、消費端定義
2.1 Dubbo配置類
package com.smart.springboot.config;
import com.alibaba.dubbo.config.*;
import com.alibaba.dubbo.rpc.service.GenericService;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author : cuantianhou 2020/4/1
*/
@Configuration
public class DubboConsumerConfig {
@Bean
public ApplicationConfig applicationConfig(){
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setId("springboot-dubbo-consumer");
applicationConfig.setName("springboot-dubbo-consumer");
return applicationConfig;
}
@Bean
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setPort(20880);
protocolConfig.setName("dubbo");
return protocolConfig;
}
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("zookeeper://10.0.20.121:2181?backup=10.0.20.131:2181,10.0.20.132:2181,10.0.20.133:2181");
registryConfig.setCheck(false);
return registryConfig;
}
@Bean
public MonitorConfig monitorConfig() {
MonitorConfig monitorConfig = new MonitorConfig();
monitorConfig.setProtocol("registry");
return monitorConfig;
}
@Bean
public ReferenceConfig<GenericService> referenceConfig(){
ReferenceConfig<GenericService> referenceConfig = new ReferenceConfig<>();
referenceConfig.setInterface("com.smart.springboot.api.HelloServiceFacade");
referenceConfig.setApplication(applicationConfig());
referenceConfig.setRegistry(registryConfig());
referenceConfig.setMonitor(monitorConfig());
referenceConfig.setVersion("1.0.0");
referenceConfig.setTimeout(20000);
referenceConfig.setId("helloService");
referenceConfig.setGeneric(Boolean.TRUE);
return referenceConfig;
}
}
2.2 啟動類
package com.smart.springboot;
import com.alibaba.dubbo.config.ReferenceConfig;
import com.alibaba.dubbo.rpc.service.GenericService;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import java.util.Arrays;
/**
* @author : cuantianhou 2020/1/14
*/
@SpringBootApplication
public class SpringBootDubboConsumer {
public static void main(String[] args) {
ConfigurableApplicationContext configurableApplicationContext = SpringApplication.run(SpringBootDubboConsumer.class,args);
String[] beanNames = configurableApplicationContext.getBeanDefinitionNames();
Arrays.asList(beanNames).forEach(System.out::println);
ReferenceConfig<GenericService> referenceConfig = configurableApplicationContext.getBean(ReferenceConfig.class);
GenericService genericService = referenceConfig.get();
genericService.$invoke("sayHello",null,null);
}
}
2.3 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.smart.springboot</groupId>
<artifactId>springboot-dubbo-consumer</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--引入dubbo環(huán)境-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.2.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
3、 運行結(jié)果

4 、結(jié)論
從泛化調(diào)用實現(xiàn)的過程來看,我們可以對自己提供所有服務(wù)進行測試,不需要引入調(diào)用的接口,減少代碼的侵入,如有問題,歡迎指正。
5、改進
關(guān)于服務(wù)暴露的改進
5.1 關(guān)于服務(wù)的實現(xiàn)
/**
* @author : cuantianhou 2020/1/14
*/
public class HelloService implements HelloServiceFacade {
@Override
public void sayHello() {
System.out.println("123");
}
}
5.2 在服務(wù)端配置中增加代碼
@Bean
public ServiceConfig<HelloServiceFacade> serviceConfig(){
ServiceConfig<HelloServiceFacade> serviceConfig = new ServiceConfig<>();
serviceConfig.setInterface("com.smart.springboot.api.HelloServiceFacade");
serviceConfig.setRef(helloService());
serviceConfig.setApplication(applicationConfig());
serviceConfig.setRegistry(registryConfig());
serviceConfig.setMonitor(monitorConfig());
serviceConfig.setVersion("1.0.0");
serviceConfig.setTimeout(20000);
serviceConfig.setId("helloService");
serviceConfig.export();
return serviceConfig;
}
@Bean
public HelloService helloService(){
return new HelloService();
}
到此這篇關(guān)于基于SpringBoot的Dubbo泛化調(diào)用的實現(xiàn)代碼的文章就介紹到這了,更多相關(guān)SpringBoot 泛化調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot項目打包鏡像方式以及區(qū)分環(huán)境打包的方法
本文主要介紹了springboot項目打包鏡像方式以及區(qū)分環(huán)境打包的方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2024-03-03
Mybatis配置之properties和settings標簽的用法
這篇文章主要介紹了Mybatis配置之properties和settings標簽的用法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-07-07
探討Java 將Markdown文件轉(zhuǎn)換為Word和PDF文檔
這篇文章主要介紹了Java 將Markdown文件轉(zhuǎn)換為Word和PDF文檔,本文通過分步指南及代碼示例展示了如何將 Markdown 文件轉(zhuǎn)換為 Word 文檔和 PDF 文件,需要的朋友可以參考下2024-07-07
常用的Spring Boot調(diào)用外部接口方式實現(xiàn)數(shù)據(jù)交互
Spring Boot提供了多種調(diào)用外部接口的方式,可以方便地實現(xiàn)與其他系統(tǒng)的數(shù)據(jù)交互,提高系統(tǒng)的可擴展性和數(shù)據(jù)共享能力,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習吧2023-04-04
Java 和 JavaScript 真正通用的Base64編碼詳解
這篇文章主要介紹了Java 和 JavaScript 真正通用的Base64編碼詳解的相關(guān)資料,附有Java和Javascript 的Base64編碼,需要的朋友可以參考下2016-11-11

