本文已参与「新人创作礼」活动,一起开启掘金创作之路。
代码地址(码云):传送门
一、安装zookeeper
1、拉取上面的代码,解压apache-zookeeper-3.6.3.zip
2、双击zookeeper中的 zkServer.cmd 运行zk服务
二、创建maven项目
1、项目结构
fds-dubbo-api:服务者提供的公共接口
fds-dubbo-provide:服务者
fds-dubbo-consumer:消费者
2、父项目pom文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.fds</groupId>
<artifactId>dubbo-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<!-- 生产者 -->
<module>fds-dubbo-provide</module>
<!-- 消费者 -->
<module>fds-dubbo-consumer</module>
</modules>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--集成springmvc框架并实现自动配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--去除spring boot默认使用的tomcat容器-->
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--替换undertow高性能轻量级服务器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<!-- zk客户端 -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.8</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</version>
</dependency>
<!-- start @Slf4j 注解日志框架 -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- end -->
<!-- Swagger API文档 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.3</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>2.9.2</version>
</dependency>
<!-- # 增加两个配置解决 NumberFormatException -->
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-annotations</artifactId>
<version>1.5.22</version>
</dependency>
<dependency>
<groupId>io.swagger</groupId>
<artifactId>swagger-models</artifactId>
<version>1.5.22</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>aliyun</id>
<name>aliyun Repository</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
3、服务者
application.yml文件:
server:
port: 8082
servlet:
context-path: /demo
# 基于此包扫描生成 Dubbo 控件
dubbo:
protocol:
# 同一个应用需要修改注册地址
port: 20881
name: dubbo
scan:
basePackages: com.fds.system.service
application:
name: fds-spring-boot-dubbo-provider
registry:
address: zookeeper://127.0.0.1:2181
SystemApplication.java:
package com.fds.system;
import lombok.extern.slf4j.Slf4j;
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.retry.ExponentialBackoffRetry;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan
@Slf4j
public class SystemApplication {
private static String registryAddress;
@Value("${dubbo.registry.address}")
public void setRegistryAddress(String registryAddress) {
this.registryAddress = registryAddress;
}
public static void main(String[] args) {
ConfigurableApplicationContext application = SpringApplication.run(SystemApplication.class, args);
try {
init();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void init() throws Exception {
CuratorFramework zkClient = CuratorFrameworkFactory.builder().
connectString(getUrl(registryAddress)).
retryPolicy(new ExponentialBackoffRetry(1000, 3)).build();
zkClient.start();
if (zkClient.checkExists().forPath("/dubbo/config/dubbo/dubbo.properties") == null) {
zkClient.create().creatingParentsIfNeeded().forPath("/dubbo/config/dubbo/dubbo.properties");
}
zkClient.setData().forPath("/dubbo/config/dubbo/dubbo.properties", ("dubbo.registry.address=" + registryAddress + "\n" +
"dubbo.metadata-report.address=" + registryAddress).getBytes());
}
public static String getUrl(String url) {
return url.substring(12);
}
}
定义服务提供接口:DubboService.java
package com.fds.system.service;
import com.fds.system.model.EsUser;
public interface DubboService {
public String getFds();
public String getDemo(String name);
public EsUser getUser(String name);
}
定义服务实现:DubboServiceImpl.java;注意@Service注解是 org.apache.dubbo.config.annotation.Service 包下面的
package com.fds.system.service;
import com.fds.system.model.EsUser;
import org.apache.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;
@Service
@Component
public class DubboServiceImpl implements DubboService {
public String getFds() {
return "hello fds";
}
public String getDemo(String name) {
System.out.println(name);
return name;
}
public EsUser getUser(String name) {
EsUser esUser = new EsUser();
esUser.setName(name);
esUser.setAge(99);
esUser.setJobs("codeBoy");
return esUser;
}
}
4、dubbo-admin项目启动,直接运行software-environment里面的dubbo-admin-0.3.0.jar架包,运行命令如下:
java -jar dubbo-admin-0.3.0.jar
然后打开浏览器:localhost:8083;用户名密码都是root,界面如下:
5、消费者
applicaton.yml
server:
port: 8086
servlet:
context-path: /demo
swagger:
base-package: com.fds.system
# 基于此包扫描生成 Dubbo 控件
dubbo:
application:
name: dubbo-consumer
registry:
address: zookeeper://127.0.0.1:2181
DemoController.class
package com.fds.system.controller;
import com.fds.system.model.EsUser;
import com.fds.system.service.DubboService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@Api(tags="dubbo测试接口")
@RestController
@RequestMapping("/string")
public class DemoController {
@Reference
DubboService dubboService;
@GetMapping("/index1")
@ApiOperation("index1")
public String demo(String name) {
return dubboService.getDemo(name);
}
@GetMapping("/getUser")
@ApiOperation("getUser")
public EsUser getUser(String name) {
return dubboService.getUser(name);
}
}
注意@Reference注解就是直接使用服务者的接口实现
打开localhost:8083/demo/doc.html,界面如下:
输入参数开始测试,这是swagger生成的测试接口,接口直接访问的服务者的参数,这要能调通这个接口,就能调用到服务者,这个dubbo消费者调用服务者的流程就算是完成了。