一 概述
Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。
-
面向接口代理的高性能RPC调用
提供高性能的基于代理的远程调用能力,服务以接口为粒度,为开发者屏蔽远程调用底层细节。 -
智能负载均衡
内置多种负载均衡策略,智能感知下游节点健康状况,显著减少调用延迟,提高系统吞吐量。 -
服务自动注册与发现
支持多种注册中心服务,服务实例上下线实时感知。 -
高度可扩展能力
遵循微内核+插件的设计原则,所有核心能力如Protocol、Transport、Serialization被设计为扩展点,平等对待内置实现和第三方实现。 -
运行期流量调度
内置条件、脚本等路由策略,通过配置不同的路由规则,轻松实现灰度发布,同机房优先等功能。 -
可视化的服务治理与运维
提供丰富服务治理、运维工具:随时查询服务元数据、服务健康状态及调用统计,实时下发路由策略、调整配置参数。
二 整合dubbo
1 创建公共服务接口module : wj-dubbo-api
定义公共接口: SpringService
package example.service;
/**
* @author: wangjun
* @create: 2018/8/7
**/
public interface SpringService {
/**
* dubbo调用测试
* @return
*/
String dubboExample();
}
2 创建服务提供方项目 wj-dubbo-server
添加依赖:
<dependencies>
<!--dubbo 公共接口依赖-->
<dependency>
<groupId>com.wj.project</groupId>
<artifactId>wj-dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<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>
<!--dubbo 依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
<!--<version>0.2.0</version>-->
</dependency>
<!--使用redis做注册中心-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
添加dubbo 配置类
package com.wj.project.server.common.Config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.ProtocolConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
/**
* @author: wangjun
* @create: 2018/8/7
**/
@Configuration
@DubboComponentScan("com.wj.project.server.example") // 扫描 Dubbo 组件
public class ProviderConfiguration {
/**
* 当前应用配置
*/
@Bean("dubbo-annotation-provider")
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("wj-dubbo-server");
return applicationConfig;
}
/**
* 当前连接注册中心配置
*/
@Bean("my-registry")
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
// registryConfig.setAddress("zookeeper://localhost:2181");
registryConfig.setAddress("redis://localhost:6379");
return registryConfig;
}
/**
* 当前连接注册中心配置
*/
@Bean("dubbo")
public ProtocolConfig protocolConfig() {
ProtocolConfig protocolConfig = new ProtocolConfig();
protocolConfig.setName("dubbo");
protocolConfig.setPort(12345);
return protocolConfig;
}
}
定义服务实现类:
package com.wj.project.server.example.service;
import com.alibaba.dubbo.config.annotation.Service;
import example.service.SpringService;
/**
* @author: wangjun
* @create: 2018/8/7
**/
@Service
public class SpringServiceImpl implements SpringService {
@Override
public String dubboExample() {
return "hello world ,hello dubbo";
}
}
3 创建服务消费方项目 :wj-dubbo-consumer、
添加依赖:
<dependencies>
<!--dubbo 公共接口依赖-->
<dependency>
<groupId>com.wj.project</groupId>
<artifactId>wj-dubbo-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<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>
<!--dubbo 依赖-->
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.0</version>
</dependency>
<!--使用redis做注册中心-->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
添加消费方配置:
package com.wj.project.consumer.common.dubbo;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.alibaba.dubbo.config.ApplicationConfig;
import com.alibaba.dubbo.config.RegistryConfig;
import com.alibaba.dubbo.config.spring.context.annotation.DubboComponentScan;
import com.wj.project.consumer.example.service.SpringConsumerService;
/**
* @author: wangjun
* @create: 2018/8/7
**/
@Configuration
@DubboComponentScan //默认扫描当前包及子包
public class ConsumerConfiguration {
/**
* 当前应用配置
*/
@Bean
public ApplicationConfig applicationConfig() {
ApplicationConfig applicationConfig = new ApplicationConfig();
applicationConfig.setName("wj-dubbo-consumer");
return applicationConfig;
}
/**
* 当前连接注册中心配置
*/
@Bean
public RegistryConfig registryConfig() {
RegistryConfig registryConfig = new RegistryConfig();
registryConfig.setAddress("redis://localhost:6379");
return registryConfig;
}
/**
* 仅供测试时使用,非测试时可注释
* <p>
* 注册 AnnotationDemoServiceConsumer,@DubboComponentScan 将处理其中 @Reference 字段。
* 如果 AnnotationDemoServiceConsumer 非 Spring Bean 的话,
* 即使 @DubboComponentScan 指定 package 也不会进行处理,与 Spring @Autowired 同理
*/
@Bean
public SpringConsumerService SpringConsumerService() {
return new SpringConsumerService();
}
}
添加消费service:
@Service
public class SpringConsumerService {
@Reference(url = "dubbo://10.9.26.208:12345")
private SpringService springService;
public String dubboExample() {
return springService.dubboExample();
}
}
4 添加测试类
测试前需启动 服务方项目
package com.wj.project.consumer.example.test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import com.wj.project.consumer.common.dubbo.ConsumerConfiguration;
import com.wj.project.consumer.example.service.SpringConsumerService;
/**
* @author: wangjun
* @create: 2018/8/7
**/
public class ConsumerBootstrap {
public static void main(String[] args) {
// 启动并且返回服务消费方上下文
ApplicationContext consumerContext = startConsumerContext();
// 获取 AnnotationDemoServiceConsumer Bean
SpringConsumerService consumer = consumerContext.getBean(SpringConsumerService.class);
// 执行 doSayHello 方法
String message = consumer.dubboExample();
// 输出执行结果
System.out.println(message);
}
/**
* 启动并且返回服务消费方上下文
*
* @return AnnotationConfigApplicationContext
*/
private static ApplicationContext startConsumerContext() {
// 创建服务消费方 Annotation 配置上下文
AnnotationConfigApplicationContext consumerContext = new AnnotationConfigApplicationContext();
// 注册服务消费方配置 Bean
consumerContext.register(ConsumerConfiguration.class);
// 启动服务消费方上下文
consumerContext.refresh();
// 返回服务消费方 Annotation 配置上下文
return consumerContext;
}
}
5 结果

版权声明:本文为CSDN博主「weixin_34357962」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_34357962/article/details/92599840