700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > springboot+dubbo+zookeeper+maven搭建微服务详细教程

springboot+dubbo+zookeeper+maven搭建微服务详细教程

时间:2020-05-30 14:24:48

相关推荐

springboot+dubbo+zookeeper+maven搭建微服务详细教程

前言: 本文将使用springboot+dubbo+zookeeper+maven搭建一套微服务。

需要提前在本地配置的环境:

maven环境zookeeper环境(在我本地zookeeper在2181端口)jdk……

完成的项目下载地址

完成项目下载地址

第一步 新建一个多模块项目(用户模块user-module)
项目结构

注意: 其中 user-module父模块 和 user-service-api 自模块 不需要对外提供访问,所以不需要提供启动类,也不需要web和相关的依赖。 只有对外提供访问的 user-app才需要各种maven类,包括 web 、dubbo等。

user-service-api模块

说明: 这个模块的 配置文件等都是空的,也基本没有相关的maven依赖。对外本程序提供api。

注意: 本模块的输出类:即vo文件夹下的实体类,例如: UserVo.java。一定要实现:Serializable序列化接口,另外这个类是和user-app中的实体类User.java一模一样的。(只是名字不一样,UserVo实现了序列化接口,仅此而已,其他都一样)

pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.itzhongzi</groupId><artifactId>user-service-api</artifactId><version>0.0.1-SNAPSHOT</version><name>user-service-api</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><build></build></project>

IUserService.java 接口类

package com.itzhongzi.userserviceapi.service;import com.itzhongzi.userserviceapi.vo.UserVo;/*** @description:* @author: lihongwei* @time: /1/8 2:18 下午*/public interface IUserService {public UserVo getUserById(Integer id);}

UserVo.java 实体类( 除了名字和实现了序列化接口外和 user-app中的User实体类必须一模一样)

package com.itzhongzi.userserviceapi.vo;import java.io.Serializable;/*** @description:* @author: lihongwei* @time: /1/8 2:19 下午*/public class UserVo implements Serializable {private int age;private String name;private String sex;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "User{" +"age=" + age +", name='" + name + '\'' +", sex='" + sex + '\'' +'}';}}

user-app模块
maven配置 pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.itzhongzi</groupId><artifactId>user-app</artifactId><version>0.0.1-SNAPSHOT</version><name>user-app</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.itzhongzi</groupId><artifactId>user-service-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!--数据库连接池工具--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.1</version></dependency><!--mysql 连接工具--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version><optional>true</optional></dependency><!--mybatis 逆向生成实体类工具--><dependency><groupId>org.mybatis.generator</groupId><artifactId>mybatis-generator-core</artifactId><scope>test</scope><version>1.3.2</version><optional>true</optional></dependency><!--apache 提供的常用工具包--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.5</version></dependency><dependency><groupId>mons</groupId><artifactId>commons-lang3</artifactId><version>3.1</version></dependency><!--mybatis starter--><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- 新增 dubbo 依赖 --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>2.7.2</version><exclusions><exclusion><artifactId>spring</artifactId><groupId>org.springframework</groupId></exclusion></exclusions></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.10</version><exclusions><exclusion><artifactId>slf4j-log4j12</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><!--zookeeper java连接工具--><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency><!--zookeeper 布丁工具包--><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.0.1</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

log4j.properties配置(dubbo内部需要使用这个配置)

project=dubbologdir=../logs/${project}### set log levels ###log4j.rootLogger = info,stdout,console# config this project appender,log level:info,error #.ts.report = info,error,bizInfo,bizErrorlog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.Target=System.outlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=%d{yyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L - %m%n## \u8F93\u51FA\u5230\u63A7\u5236\u53F0 ###log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.stdout.File=${logdir}/all.loglog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.DatePattern='_'yyyy-MM-ddlog4j.appender.stdout.layout.ConversionPattern=%d{yyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L - %m%n# info log everyday file#log4j.loger.bizInfo = info,bizInfolog4j.appender.bizInfo=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.bizInfo.File=${logdir}/info.loglog4j.appender.bizInfo.layout=org.apache.log4j.PatternLayoutlog4j.appender.bizInfo.DatePattern='_'yyyy-MM-ddlog4j.appender.bizInfo.layout.ConversionPattern=%d{yyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L - %m%nlog4j.appender.bizInfo.Threshold=INFO#log4j.additivity.bizInfo=false## error log ##log4j.loger.bizError = info,bizErrorlog4j.appender.bizError = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.bizError.File = ${logdir}/error.loglog4j.appender.bizError.layout = org.apache.log4j.PatternLayoutlog4j.appender.bizError.DatePattern='_'yyyy-MM-ddlog4j.appender.bizError.layout.ConversionPattern =%d{yyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L - %m%nlog4j.appender.bizError.Threshold = ERROR#log4j.additivity.error=false## error log ##log4j.loger.error = info,errorlog4j.appender.error = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.error.File = ${logdir}/sys_error.loglog4j.appender.error.layout = org.apache.log4j.PatternLayoutlog4j.appender.error.DatePattern='_'yyyy-MM-ddlog4j.appender.error.layout.ConversionPattern =%d{yyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L - %m%nlog4j.appender.error.Threshold = ERROR#log4j.additivity.error=false

application.yml 该模块的配置文件

server:port: 8086# dubbo 配置dubbo:application:name: user-app# 使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper# 注册中心idregistry:id: zookeeper-registry# 注册中心协议protocol: zookeeper# 注册中心地址address: 127.0.0.1:2181# dubbo协议在20880端口暴露服务# 协议名称protocol:name: dubbo# 协议端口 对外提供访问的端口port: 20880# 协议访问logaccesslog: dubbo-access.log# 重试次数provider:#重试次数retries: 0# 超时时间timeout: 3000# 注册监控中心monitor:protocol: registryconfig-center:protocol: zookeeperaddress: 127.0.0.1:2181

UserAppApplication.java 启动类

package com.itzhongzi.userapp;import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@EnableDubboConfig@DubboComponentScan("com.itzhongzi.userapp.service.dubbo")@SpringBootApplicationpublic class UserAppApplication {public static void main(String[] args) {SpringApplication.run(UserAppApplication.class, args);}}

UserController.java controller

package com.itzhongzi.userapp.controller;import com.itzhongzi.userapp.service.dubbo.UserService;import com.itzhongzi.userserviceapi.vo.UserVo;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** @description:* @author: lihongwei* @time: /1/8 2:28 下午*/@RestControllerpublic class UserController {@Resourceprivate UserService userService;@RequestMapping("/get_user")public UserVo getUserById(Integer id){UserVo getUser = userService.getUserById(id);return getUser;}}

User.java 实体类

package com.itzhongzi.userapp.domain;/*** @description:* @author: lihongwei* @time: /1/8 2:15 下午*/public class User {private int age;private String name;private String sex;public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}@Overridepublic String toString() {return "User{" +"age=" + age +", name='" + name + '\'' +", sex='" + sex + '\'' +'}';}}

UserService.java 服务类 对外暴露的api接口

注意: 这个类 实现了 另一个自定义模块user-service-api中的接口,初次引入会报错,等把另一个项目 user-service-api建好,并引入项目之后便不会报错。

package com.itzhongzi.userapp.service.dubbo;import com.itzhongzi.userserviceapi.service.IUserService;import com.itzhongzi.userserviceapi.vo.UserVo;import org.apache.dubbo.config.annotation.Service;/*** @description:* @author: lihongwei* @time: /1/8 2:20 下午*/@Servicepublic class UserService implements IUserService{@Overridepublic UserVo getUserById(Integer id) {UserVo user = null;if(id == null || id == 0) {user = new UserVo();user.setName("new 李洪伟");user.setAge(18);user.setSex("男");}//去查询数据库 假装查到了数据user = new UserVo();user.setName("数据库 李洪伟");user.setAge(id);user.setSex("数据库 男");return user;}}

注意: 要想用 UserService去继承 IUserService,一定要在 user-app中引入 user-service-api模块,如下图:

<!--引入本项目中的另一个模块 user-service-api--><dependency><groupId>com.itzhongzi</groupId><artifactId>user-service-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency>

coupon-module优惠券模块

优惠券模块本质上就是把 user-module拷贝一份,然后 修改几个一下几个地方

各个pom.xml文件修改 package的报名修改类的入口把不需要的类给删除

如果不知道怎么修改,就从头创建一个多么快的项目,效果是一样的。

项目结构
coupon-service-api 模块

user-service-api 模块 基本所有的内容都是空的,象征醒的剪了一个模块。maven配置如下

pom.xml maven配置

<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.itzhongzi</groupId><artifactId>coupon-service-api</artifactId><version>0.0.1-SNAPSHOT</version><name>coupon-service-api</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies><build></build></project>

coupon-app 模块
pom.xml maven配置

<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance"xsi:schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.itzhongzi</groupId><artifactId>coupon-app</artifactId><version>0.0.1-SNAPSHOT</version><name>coupon-app</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><!--引入本项目中的另一个模块 coupon-service-api--><dependency><groupId>com.itzhongzi</groupId><artifactId>coupon-service-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency><!-- 新增 dubbo 依赖 --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>2.7.2</version><exclusions><exclusion><artifactId>spring</artifactId><groupId>org.springframework</groupId></exclusion></exclusions></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.10</version><exclusions><exclusion><artifactId>slf4j-log4j12</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><!--zookeeper java连接工具--><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency><!--zookeeper 布丁工具包--><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>4.0.1</version></dependency><!-- 重要 引入 user-module 用户模块的jar包 --><dependency><groupId>com.itzhongzi</groupId><artifactId>user-service-api</artifactId><version>0.0.1-SNAPSHOT</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

log4j.properties 日志配置

project=dubbologdir=../logs/${project}### set log levels ###log4j.rootLogger = info,stdout,console# config this project appender,log level:info,error #.ts.report = info,error,bizInfo,bizErrorlog4j.appender.console=org.apache.log4j.ConsoleAppenderlog4j.appender.console.Target=System.outlog4j.appender.console.layout=org.apache.log4j.PatternLayoutlog4j.appender.console.layout.ConversionPattern=%d{yyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L - %m%n## \u8F93\u51FA\u5230\u63A7\u5236\u53F0 ###log4j.appender.stdout=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.stdout.File=${logdir}/all.loglog4j.appender.stdout.layout=org.apache.log4j.PatternLayoutlog4j.appender.stdout.DatePattern='_'yyyy-MM-ddlog4j.appender.stdout.layout.ConversionPattern=%d{yyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L - %m%n# info log everyday file#log4j.loger.bizInfo = info,bizInfolog4j.appender.bizInfo=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.bizInfo.File=${logdir}/info.loglog4j.appender.bizInfo.layout=org.apache.log4j.PatternLayoutlog4j.appender.bizInfo.DatePattern='_'yyyy-MM-ddlog4j.appender.bizInfo.layout.ConversionPattern=%d{yyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L - %m%nlog4j.appender.bizInfo.Threshold=INFO#log4j.additivity.bizInfo=false## error log ##log4j.loger.bizError = info,bizErrorlog4j.appender.bizError = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.bizError.File = ${logdir}/error.loglog4j.appender.bizError.layout = org.apache.log4j.PatternLayoutlog4j.appender.bizError.DatePattern='_'yyyy-MM-ddlog4j.appender.bizError.layout.ConversionPattern =%d{yyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L - %m%nlog4j.appender.bizError.Threshold = ERROR#log4j.additivity.error=false## error log ##log4j.loger.error = info,errorlog4j.appender.error = org.apache.log4j.DailyRollingFileAppenderlog4j.appender.error.File = ${logdir}/sys_error.loglog4j.appender.error.layout = org.apache.log4j.PatternLayoutlog4j.appender.error.DatePattern='_'yyyy-MM-ddlog4j.appender.error.layout.ConversionPattern =%d{yyy-MM-dd HH\:mm\:ss} %5p %c{1}\:%L - %m%nlog4j.appender.error.Threshold = ERROR#log4j.additivity.error=false

application.yml

server:port: 8088# dubbo 配置dubbo:application:name: user-appqosEnable: trueqosPort: 33333qosAcceptForeignIp: false# 使用 zookeeper 注册中心暴露服务,注意要先开启 zookeeper# 注册中心idregistry:id: zookeeper-registry# 注册中心协议protocol: zookeeper# 注册中心地址address: 127.0.0.1:2181# dubbo协议在20880端口暴露服务# 协议名称protocol:name: dubbo# 协议端口 对外提供访问的端口port: 20881# 协议访问logaccesslog: dubbo-access.log# 重试次数provider:#重试次数retries: 0# 超时时间timeout: 3000# 注册监控中心monitor:protocol: registryconfig-center:protocol: zookeeperaddress: 127.0.0.1:2181

注意 多个 dubbo项目部署在同一个电脑上时,dubbo对外访问的端口不要相同,否则会报 端口占用的错误。

CouponAppApplication.java 入口文件

注意: 入口类开启 dubbo时,使用@DubboComponentScan("com.itzhongzi.userapp.service.dubbo")中的包名,是user-module模块中对外提供的service报名。

package com.itzhongzi.couponapp;import org.apache.dubbo.config.spring.context.annotation.DubboComponentScan;import org.apache.dubbo.config.spring.context.annotation.EnableDubboConfig;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@EnableDubboConfig@DubboComponentScan("com.itzhongzi.userapp.service.dubbo")@SpringBootApplicationpublic class CouponAppApplication {public static void main(String[] args) {SpringApplication.run(CouponAppApplication.class, args);}}

CouponService.java 优惠券服务类

在这里面调用远程接口远程类自动注入要用@ReferenceIUserService为 user-module模块的服务类

package com.itzhongzi.couponapp.service;import com.itzhongzi.userserviceapi.service.IUserService;import com.itzhongzi.userserviceapi.vo.UserVo;import org.apache.dubbo.config.annotation.Reference;import org.springframework.stereotype.Service;/*** @description:* @author: lihongwei* @time: /1/8 4:06 下午*/@Servicepublic class CouponService {@Referenceprivate IUserService iUserService;public UserVo getCouponUser(Integer id){return iUserService.getUserById(id);}}

TestController.java 测试类

package com.itzhongzi.couponapp.controller;import com.itzhongzi.couponapp.service.CouponService;import com.itzhongzi.userserviceapi.vo.UserVo;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import javax.annotation.Resource;/*** @description:* @author: lihongwei* @time: /1/8 4:08 下午*/@RestControllerpublic class TestController {@Resourceprivate CouponService couponService;@RequestMapping("coupon_user")public UserVo getUser(Integer id){return couponService.getCouponUser(id);}}

测试

我们把两个项目都启动,user-module在8086端口,coupon-module在8088端口。

我们去请求 8088 端口coupon-mudule开放的api,看看能不能 调用user-module的模块。

如图所示,请求成功。

这样我们springboot+dubbo+zookeeper搭建的微服务框架就搭建完毕了。后续可以自己加入数据库等各种配置。

谢谢观看。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。