1、入门案例
1.1、服务提供者
- 服务提供者(包括服务实现类和接口)需要将自己的“服务接口类”暴露出来
- 需要配置引入 jar 包的依赖
- 可以将服务提供者和消费者之间公共的 bean 和 service 接口暴露出来
- 在 IDEA 中配置时,只需要在“父项目”中配置 pom.xml 即可
依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<!-- curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>com.bigguy.service</groupId>
<artifactId>service-interface</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
接口
public interface UserService {
public String sayHello();
}
接口实现类
public class UserServiceImpl implements UserService {
@Override
public String sayHello() {
return "hello , bigguy!";
}
}
配置文件
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="service-app" />
<!-- 使用zookeeper广播注册中心暴露服务地址 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 用dubbo协议在20880端口暴露服务 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 声明需要暴露的服务接口,这里的 ref 指向的是下面的 接口实现类 -->
<dubbo:service interface="com.bigguy.service.UserService" ref="demoService" />
<!-- 和本地bean一样实现服务 -->
<bean id="demoService" class="com.bigguy.service.UserServiceImpl" />
</beans>
测试方法
public class MainApp {
public static void main(String args[]) throws IOException {
String xmlPath = "classpath:context.xml";
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(xmlPath);
context.start();
System.in.read(); // 按任意键退出
}
}
1.2、服务消费者
- 只需要编写接口类(UserService,这个接口类和服务提供者一致),实现从 zookeeper 中获取
配置文件
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="consumer-of-helloworld-app" />
<!-- 使用zookeeper广播注册中心暴露服务地址,这里的 2181 是指zookeeper 的启动端口 -->
<dubbo:registry address="zookeeper://127.0.0.1:2181" />
<!-- 指向接口类,这里的id 随意取,目的是通过 Spring容器获取 -->
<dubbo:reference id="demoService" interface="com.bigguy.service.UserService" />
</beans>
测试方法
public class ConsumerMainApp {
public static void main(String args[]) throws IOException {
String xmlPath = "classpath:context.xml";
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(xmlPath);
UserService service = context.getBean(UserService.class);
// UserService service = (UserService)context.getBean("demoService");
String str = service.sayHello();
System.out.println(str);
System.in.read();
}
}
2、整合SpringBoot(使用 zookeeper注册中心)
2.1、服务端
a. pom
在 github 中搜索可以得到
https://github.com/apache/incubator-dubbo-spring-boot-project
<dependency>
<groupId>com.alibaba.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>0.1.1</version>
</dependency>
b. 配置文件(application.properties )
dubbo.application.name=service-provider
dubbo.registry.address=127.0.0.1:2181
dubbo.registry.protocol=zookeeper
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
c. 暴露接口
@Service // 使用的是 dubbo 的 service 注解
@Component
public class UserServiceImpl implements UserService {
public User getUserById(Integer id) {
return new User(1,"jeck");
}
}
d. 开启基于注解的 dubbo
@EnableDubbo // 开启基于注解的dubbo
@SpringBootApplication
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
}
2.2、服务消费者
a. 配置文件
server.port=8081
dubbo.application.name=service-consumer
dubbo.registry.address=127.0.0.1:2181
dubbo.registry.protocol=zookeeper
b. 引用 service
@Reference 引用 service
@Controller
public class UserController {
@Reference // 使用 dubbo 的reference
UserService service;
@ResponseBody
@GetMapping("user")
public User getUser(){
User user = service.getUserById(1);
return user;
}
c. 开启基于主机的配置
@EnableDubbo // 开启基于注解的 dubbo
@SpringBootApplication
public class ServiceConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ServiceConsumerApplication.class, args);
}
}
3、SpringBoot 使用Dubbo(不通过zookeeper)
**参考地址:**https://github.com/alibaba/dubbo-spring-boot-starter
3.1、服务提供者
a、pom.xml
- 不用继承父springboot 方式
<?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.bigguy.frame</groupId>
<artifactId>frame-client-provider</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>1.4.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- SpringBoot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- zk -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
b、服务提供者配置
spring.application.name=dubbo-spring-boot-starter
spring.dubbo.server=true
# 表示不使用 zookeeper 等服务中心
spring.dubbo.registry=N/A
c、服务提供者的服务实例
使用 Dubbo 的注解 Service
@Service(interfaceClass = IHelloService.class)
@Component
public class HelloServiceImpl implements IHelloService {
//...
}
d、启动类
- 启动Dubbo
@SpringBootApplication
@EnableDubboConfiguration
public class FrameConsumerApp {
public static void main(String[] args) {
SpringApplication.run(FrameConsumerApp.class, args);
}
}
3.2、服务消费者
a、pom.xml
- 和服务提供者的pom一致
b、消费者使用服务提供者的服务
@Reference(url = “dubbo://127.0.0.1:20880”) ,在 Reference 中指定连接的 url
@Component
public class HelloConsumer {
@Reference(url = "dubbo://127.0.0.1:20880")
private IHelloService iHelloService;
}
c、消费者启动类
@SpringBootApplication
@EnableDubboConfiguration
public class FrameConsumerApp {
public static void main(String[] args) {
SpringApplication.run(FrameConsumerApp.class, args);
}
}
4、使用注册中心
4-1、服务提供者配置
server.port=8081
server.context-path=/
spring.application.name=dubbo-spring-boot-starter
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.server=true
spring.dubbo.registry=zookeeper://172.30.0.177:2181
4-2、服务消费者
server.port=8080
spring.application.name=dubbo-spring-boot-starter-consumer
spring.dubbo.registry.address=zookeeper://172.30.0.177:2181
spring.dubbo.scan=org.spring.springboot.dubbo