springBoot搭建dubbo+zookeeper微服务项目-从零开始
参考dubbo官方文档
1.搭建dubbo项目
搭建springBoot项目有几种方式,我这里以maven引jar包的方式搭建
也可以直接创建springBoot项目
或者再springBoot官网创建号项目导入, 看自己意思来
聚合项目
1.搭建父项目dubbo-hc
点击完成
2.搭建子项目
右键父项目创建子项目
点击完成
user-service和user-web同上步骤
完成后项目结构:
子项目功能作用:
user-api: 对外统一接口
user-service: 接口实现- -业务功能- -服务提供方- -生产者- -对外暴露服务- - -随你怎么理解
user-web: 控制层- -路由- -消费者- - -随你怎么理解
user-api结构
UserService代码
package com.hc.user.service;
public interface UserService {
String sayHello();
}
user-service结构
UserServiceImpl代码
package com.hc.user.service.impl;
import com.hc.user.service.UserService;
import org.apache.dubbo.config.annotation.Service;
import java.io.Serializable;
@Service(version = "1.0.0")
public class UserServiceImpl implements UserService{
public String sayHello() {
System.out.println("生产者正在提供数据*****");
return "hello 哈喽 ";
}
}
UserServiceApplication启动类代码
package com.hc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class UserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(UserServiceApplication.class,args);
}
}
user-ervice的pom.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">
<parent>
<artifactId>dubbo-hc</artifactId>
<groupId>com.hc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user-service</artifactId>
<properties>
<spring-boot.version>2.1.1.RELEASE</spring-boot.version>
<dubbo.version>2.7.3</dubbo.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Aapche Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<!-- 引入user-api项目 -->
<dependency>
<groupId>com.hc</groupId>
<artifactId>user-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
application.yml文件
spring:
application:
name: dubbo-user-service #项目名称
dubbo:
scan:
base-packages: com.hc.user.service.impl #包扫描地址
protocol:
name: dubbo
port: 8081 #服务端口
registry:
address: N/A #注册中心地址,就是dubbo默认提供了一个简单的注册中心服务,下面给出解释,等下一步赔了zookeeper,再填zookeeper的地址
基于dubbo协议开源只是给出了默认一个注册中心实现SimpleRegistryService, 它只是一个简单实现,不支持集群,就是利用Map<String/ip:port/, Map<String/service/, URL>来存储服务地址
源码:
SimpleRegistryService本身也是作为一个dubbo服务暴露。
<dubbo:protocolport="9090" />
<dubbo:service interface="com.alibaba.dubbo.registry.RegistryService"ref="registryService" registry="N/A" ondisconnect="disconnect"callbacks="1000">
<dubbo:methodname="subscribe"><dubbo:argument index="1" callback="true"/></dubbo:method>
<dubbo:methodname="unsubscribe"><dubbo:argument index="1" callback="false"/></dubbo:method>
</dubbo:service>
<bean id="registryService"class="com.alibaba.dubbo.registry.simple.SimpleRegistryService" />
然后是user-web结构
UserController
package com.hc.usercontroller;
import com.hc.user.service.UserService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@Reference(version = "1.0.0" , url = "127.0.0.1:8081")
private UserService userService;
@RequestMapping("/hello")
public String sayHello(){
System.out.println("消费者调用成功!!!!!!!");
return userService.sayHello();
}
}
UserWebApplication代码
package com.hc;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class UserWebAppliction {
public static void main(String[] args) {
SpringApplication.run(UserWebAppliction.class,args);
}
}
user-web的pom.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">
<parent>
<artifactId>dubbo-hc</artifactId>
<groupId>com.hc</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>user-web</artifactId>
<properties>
<spring-boot.version>2.1.1.RELEASE</spring-boot.version>
<dubbo.version>2.7.3</dubbo.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Aapche Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-dependencies-bom</artifactId>
<version>${dubbo.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>org.springframework</groupId>
<artifactId>spring</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.hc</groupId>
<artifactId>user-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</project>
application.yml文件
spring:
application:
name: dubbo-auto-configure-consumer-sample
至此简单的dubbo项目完成
这里我要说一个坑 我也没有整明白,看结果:
启动user-service
启动user-web
启动非常正常,一点没报错
但是但是 请看结果
访问localhost:8080/user/hello
再看看官网例子
具体什么原因,咱也不敢说,咱也没地儿问
我只能说这个例子的解决方法,后面搭了zookeeper就正常了
就是把服务提供方user-service中的实现类上的注解@service中的version去掉或者写成0.0.0
还有调用方的@Reference中的version去掉或者写成0.0.0
记住版本必须对应,不然报错 =====这里后面搭了zookeeper注册中心, 版本就可自己定了
再重新启动 看访问结果:
完美
zookeeper注册中心
不熟悉zookeeper的先去看看zookeeper教程
https://blog.csdn.net/weixin_43606738/article/details/100290832
curator对zookeeper封装了很好的api
user-service和user-web都引入zookeeper依赖 如下:
<!-- Zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
</dependency>
user-service项目中的yml文件
spring:
application:
name: dubbo-user-service
dubbo:
scan:
base-packages: com.hc.user.service.impl
protocol:
name: dubbo
port: 8081
registry:
address: zookeeper://192.168.1.101:2181 #这里填写你自己真是的zookeeper地址
user-web项目中的yml文件
spring:
application:
name: dubbo-user-web
#添加注册中心地址
dubbo:
registry:
address: zookeeper://192.168.1.101:2181 #这里填写你自己真是的zookeeper地址
服务版本可以自己定义了
@Reference(version = “1.0.0”)中的url就不用指定了 yml已经配置了注册中心了
启动因该没有任何问题了,然后我们查看一下zookeeper的节点
看看服务的版本号
至此 dubbo+zookeeper服务已经实现
dubbo-admin可视化控制台
dubbo2.6以前都是dubbo-admin
现在改版了 前后端分离了,后端用的springboot框架,可以直接用java - jar 启动项目了
没必要再丢到tomcat下了
参考官网
http://dubbo.apache.org/zh-cn/docs/admin/introduction.html
官网其实写的很清楚了
我再写一下我的步骤:
1.安装node.js
2.安装npm
为什么要安装这两个,因为dubbo-admin-ui项目下需要下载前端需要的依赖
3,如果没有安装git 就直接去https://github.com/apache/dubbo-admin.git下载压缩包,并解压
4,打开cmd命令控制台 切换到你刚刚的解压包目录下即dubbo-admin-develop
5,执行 mvn clean package #别告诉我你连maven都没有安装
这需要很长的时间,因为npm要下载依赖
编译成功你会看到dubbo-admin-develop\dubbo-admin-distribution\多了一个target目录
切换到该目录下
6,运行命令 java -jar dubbo-admin-0.1.jar
7,访问localhost:8080
界面如下
具体用法 后续跟新
后续会更新网关,熔断,服务降级,集群 等等,请持续关注