优秀的 RPC 服务治理框架,直接查看 官网.
作为 注册中心 和 参数配置中心使用, 本次作为dubbo 服务注册发现中心,介绍查看官网.
本次测试环境
springboot 2.2.6
dubbo 2.7.7
通过反复查看官网和官方demo, 其实基本可以不用 dubbo-spring-boot-starter 配置dubbo,dubbo本身就支持注解方式配置。
配置的 pom文件如下
<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.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.2.6.RELEASEversion>
<relativePath/>
parent>
<groupId>com.middolgroupId>
<artifactId>dubbo-test1artifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding>
<maven.compiler.source>1.8maven.compiler.source>
<maven.compiler.target>1.8maven.compiler.target>
<java.version>1.8java.version>
<dubbo.version>2.7.7dubbo.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubboartifactId>
<version>${dubbo.version}version>
dependency>
<dependency>
<groupId>org.apache.dubbogroupId>
<artifactId>dubbo-registry-nacosartifactId>
<version>${dubbo.version}version>
dependency>
dependencies>
project>
application.yml 配置如下
server:
port: 8081
# log详细配置请查看 logback-spring.xml, springboot可自动加载 resources/logback-spring.xml
logging:
level:
root: INFO
#spring:
# main:
# allow-bean-definition-overriding: true
dubbo:
application:
name: dubbo-samples-annotation
# 注册中心配置。对应的配置类: org.apache.dubbo.config.RegistryConfig。同时如果有多个不同的注册中心,
# 可以声明多个 标签,并在 或 的 registry 属性指定使用的注册中心。
registry:
address: nacos://你的nacos服务器ip:8848
check: false
# 服务提供者协议配置。对应的配置类: org.apache.dubbo.config.ProtocolConfig。
# 同时,如果需要支持多协议,可以声明多个 标签,并在 中通过 protocol 属性指定使用的协议。
protocol:
name: dubbo
port: 20880
# 服务消费者缺省值配置。配置类: org.apache.dubbo.config.ConsumerConfig 。
# 同时该标签为 标签的缺省值设置
consumer:
timeout: 30000
retries: 0
check: false
主要注意上面的 retries check 参数,
check为false 表示 springboot 启动暂不查验服务是否存在或服务是否可注册成功,
如果为 true 很可能导致启动失败,例如注册中心不存在,服务提供者不存在时。
check 默认为true
具体的其他参数查看 官方配置文档
http://dubbo.apache.org/zh-cn/docs/user/references/xml/dubbo-service.html
很简单就两测试方法
package com.middol.dubbo.api;
/**
* @author admin
*/
public interface HelloService {
/**
* sayHello
*
* @param name ignore
* @return String
*/
String sayHello(String name);
/**
* sayGoodbye
*
* @param name aa
* @return string
*/
default String sayGoodbye(String name) {
return "Goodbye, " + name;
}
}
package com.middol.dubbo.impl.provider;
import com.middol.dubbo.api.HelloService;
import org.apache.dubbo.config.annotation.DubboService;
/**
* 服务提供者
*
* @author admin
*/
@DubboService(version = "1.0")
public class HelloServiceImpl implements HelloService {
@Override
public String sayHello(String name) {
System.out.println("provider received invoke of sayHello: " + name);
sleepWhile();
return "Annotation, hello " + name;
}
@Override
public String sayGoodbye(String name) {
System.out.println("provider received invoke of sayGoodbye: " + name);
sleepWhile();
return "Goodbye, " + name;
}
private void sleepWhile() {
try {
Thread.sleep(300);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
这里注意 如果version 赋值了,请在消费端配置时保持version一致哦
实际情况是, 服务提供者将 api接口 打成jar包,放入maven私服中,服务消费端下载该jar包,本次就省略了该步骤, 消费者服务者在一个工程里面。
package com.middol.dubbo.consumer;
import com.middol.dubbo.api.HelloService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.springframework.stereotype.Component;
/**
* 服务订阅者
*
* @author admin
*/
@Component
public class TestConsumerService {
@DubboReference(version = "1.0",consumer = "hello测试")
private HelloService helloService;
/**
* sayHello
*
* @param name ignore
* @return String
*/
public String sayHello(String name) {
return helloService.sayHello(name);
}
/**
* sayGoodbye
*
* @param name aa
* @return string
*/
public String sayGoodbye(String name) {
return helloService.sayGoodbye(name);
}
}
主要是 注解 @DubboReference(version = “1.0”,consumer = “hello测试”) 表示引入服务提供者的api接口
package com.middol.dubbo;
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 系统入口
*
* @author guzhongtao
*/
@SpringBootApplication
@EnableDubbo(scanBasePackages = {"com.middol.dubbo.impl.provider", "com.middol.dubbo.consumer"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
上面的 @EnableDubbo 就是配置 消费者的包路径 提供者的包路径
先启动 nacos ,然后springboot, 不出意外会抛出异常
APPLICATION FAILED TO START
Description:
The bean 'dubboBootstrapApplicationListener' could not be registered. A bean with that name has already been defined and overriding is disabled.
Action:
这里查看 github dubbo Issues 6231.
可明白原因, 当然临时解决可以在application.yml里面加入以下信息:
spring:
main:
allow-bean-definition-overriding: true
写个controller 类测试一下吧
package com.middol.dubbo.controller;
import com.middol.dubbo.consumer.TestConsumerService;
import com.middol.dubbo.impl.provider.HelloServiceImpl;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* controller 测试入口
*
* @author admin
*/
@RestController
@RequestMapping("/")
public class TestController {
@Resource
private HelloServiceImpl annotationHelloService;
@Resource
private TestConsumerService testConsumerService;
@GetMapping("localtest")
public String localtest() {
annotationHelloService.sayHello("我是本地方法 sayHello");
annotationHelloService.sayGoodbye("我是本地方法 sayGoodbye");
return "localtest ok";
}
@GetMapping("dubbotest")
public String dubbotest() {
testConsumerService.sayHello("我是dubbo方法 sayHello");
testConsumerService.sayGoodbye("我是dubbo方法 sayGoodbye");
return "dubbotest ok";
}
}
理论上可以调用成功,本人测试通过, 查看nacos 管理平台可发现服务注册情况。
如果需要测试代码工程 点击访问 github 点击这里.