文章目录
前言
博主使用了虚拟机搭建了zookeeper集群,但是dubboAdmin在宿主机运行,无法连接到虚拟机里面的zookeeper集群,配置了防火墙也没用,但在宿主机上搭建zookeeper服务器,可以秒连接,可能是由于dubboAdmin设置了连接超时,如果dubboAdmin无法连接zookeeper就无法启动,所以这里是在window环境下使用zookeeper,如果想看linux如何搭建zookeeper集群可以看我这篇文章 Linux 从零开始部署zookeeper集群遇到的问题
下载zookeeper
在浏览器运行如下地址就可以下载apache-zookeeper-3.7.0-bin.tar.gz包了
https://dlcdn.apache.org/zookeeper/zookeeper-3.7.0/apache-zookeeper-3.7.0-bin.tar.gz
解压
下载后就是解压了,windows解压使用专门的解压软件即可如WinRAR,解压后得到如下文件夹
修改配置文件
将conf文件夹下的zoo_sample.cfg名称修改为zoo.cfg,并修改其内容,将dataDir改为如下,其他就无须改变了
dataDir=E:\apache-zookeeper-3.7.0-bin\data
启动zookeeper
最好下个git,这样右键后就有git bush命令行工具了,如果没有下载使用window命令行也可以,window键+R出现运行,然后输入cmd回车,如下
cd E:\apache-zookeeper-3.7.0-bin
cd bin
./zkServer.cmd
出现如下情况,则启动成功
下载dubboAdmin
进入网址https://gitcode.net/mirrors/apache/dubbo-admin,点克隆下载zip文件,得到dubbo-admin-develop.zip,这是新版的dubboAdmin,老版本的dubboAdmin打包成war需要部署在tomcat服务器中,然后我试过很多版本的tomcat都无法配置成功
解压dubbo-admin-develop.zip
得到如下文件夹
修改配置
打开如下路径dubbo-admin-develop\dubbo-admin-server\src\main\resources下的application.properties,修改其配置,修改端口即可,其他不用变,因为windows下的zookeeper会占用8080端口,而dubbo-admin-develop默认启动端口为8080,下面就是zookeeper服务器的地址,如果是虚拟机将127.0.0.1改为虚拟机中运行ifconfig显示的ip地址,但是很有可能连接不上
mvn打包
使用mvn必须安装maven并配置好mvn环境变量,使用dubbo必须有jdk,在dubbo-admin-develop目录下运行mvn package -Dmaven.test.skip=true,打包的时候可能会出现问题,因为需要安装node,此时会卡住,但是没关系,解决方法就是关闭命令行,重新运行如下命令打包即可
mvn package -Dmaven.test.skip=true
打包成功出现如下信息
启动dubbo-admin服务器
将命令行移动到dubbo-admin-develop\dubbo-admin-server\target目录下,执行如下代码,注意dubbo-admin-server-0.4.0.jar名称以你自己的电脑上名字为准,因为以后可能版本不同
java -jar dubbo-admin-server-0.4.0.jar
出现如下信息,且没有报错则启动成功
登录dubbo-admin
输入http://localhost:8081/就会默认跳转到登录界面,默认登录的账户是root密码是root,如果不对则在dubbo-admin-develop\dubbo-admin-server\src\main\resources下的application.properties这个配置文件查看,如下配置就是决定账号和密码
登录成功出现如下界面,表示dubboAdmin启动成功
使用dubbo
简单构建
按照如下目录结构创建,且只有6个文件有内容,在下面会一一列出
pmx.xml
<?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.lolxxs</groupId>
<artifactId>springboot_dubbo</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- 整合dubbo -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<!-- zookeeper客户端 -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.7</version>
</dependency>
</dependencies>
</project>
DubboApplication.java
package com.lolxxs;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DubboApplication {
public static void main(String[] args) {
SpringApplication.run(DubboApplication.class);
}
}
TestService.java
package com.lolxxs.service;
public interface TestService {
String testDubbo();
}
TestService.java
package com.lolxxs.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.dubbo.rpc.RpcContext;
import com.lolxxs.service.TestService;
@Service(version = "1.0.0", timeout = 3000)
public class TestServiceImpl implements TestService {
@Override
public String testDubbo() {
System.out.println("调用了");
return "远程地址"+ RpcContext.getContext().getRemoteAddress()+" 本地地址"+ RpcContext.getContext().getLocalAddress();
}
}
TestController.java
package com.lolxxs.controller;
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.dubbo.rpc.RpcContext;
import com.lolxxs.service.TestService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/consumer")
public class TestController {
@Reference(version = "1.0.0", timeout = 300)
private TestService testService;
@GetMapping("/test")
public String getTest() {
return testService.testDubbo();
}
}
application.yml
server:
port: 9000
spring:
dubbo:
application:
name: springboot-dubbo-demo
registry:
address: zookeeper://127.0.0.1
port: 2181
protocol:
name: dubbo
port: 20890
scan: com.lolxxs.service
创建好直接运行DubboApplication类
出现如下信息说明启动了dubbo服务,并且dubbo服务成功连接zookeeper
点击搜索,会发现多出了一个,就是我们刚刚创建的服务,也就是服务器的提供者
点击最后一个详情,出现如下,说明只有一个dubbo服务
我们启动好了服务提供者(生产者),也就要启动服务消费者,只需要改动配置文件后application.yml,再次点击DubboApplication类中的按钮启动即可,注意之前的服务器不能关闭,idea可以启动多个服务器,eclipse我以前用过好像没法启动多个服务器,配置文件修改端口和包扫描scan改为扫描controller包
application.yml
server:
port: 9002
spring:
dubbo:
application:
name: springboot-dubbo-consumer
registry:
address: zookeeper://127.0.0.1
port: 2181
protocol:
name: dubbo
port: 20890
scan: com.lolxxs.controller
启动成功后,有两种方法测试,一种是直接在浏览器输入http://localhost:9002/consumer/test,第二种就是使用postman,在postman输入http://localhost:9002/consumer/test,使用get请求,这里为了简单使用浏览器输入,如下,可以看到收到响应
并且可以看到,第一个服务器是服务器提供者,第二个服务器是服务器消费者,我们访问的是服务器消费者,但是却是服务器提供者执行的代码,这就是RPC(Remote Procedure Call)
负载均衡
观察负载均衡我们需要启动两个服务器提供者,修改配置文件即可,两个服务提供者的端口不能相同,并且protocol下面的端口也不能相同,服务消费者和上面配置一模一样。注意两个服务提供者的application.name必须相同,要不然它们就是两种服务了,不是一种服务的两个服务器提供者
服务提供者1
application.yml
server:
port: 9000
spring:
dubbo:
application:
name: springboot-dubbo-demo
registry:
address: zookeeper://127.0.0.1
port: 2181
protocol:
name: dubbo
port: 20890
scan: com.lolxxs.service
服务提供者2
application.yml
server:
port: 9001
spring:
dubbo:
application:
name: springboot-dubbo-demo
registry:
address: zookeeper://127.0.0.1
port: 2181
protocol:
name: dubbo
port: 20891
scan: com.lolxxs.service
服务消费者
application.yml
server:
port: 9002
spring:
dubbo:
application:
name: springboot-dubbo-consumer
registry:
address: zookeeper://127.0.0.1
port: 2181
protocol:
name: dubbo
port: 20890
scan: com.lolxxs.controller
然后依次启动三个服务器,查看dubboAdmin,可以发现消费者和服务提供者都注册成功了
点击服务提供者的详情,可以发现该服务现在有两个提供者了,所以就可以使用负载均衡策略了
在浏览器多次输入http://localhost:9002/consumer/test,会发现请求同一个地址,访问的服务器可能不同,本地地址不同,也就是我们上面配置的dubbo暴露端口
查看idea中服务器运行情况,也可以发现两个服务提供者服务器都运行了,且运行次数不同