springboot+dubbo+zookeeper实现微服务
1、将基础服务打包发布到私服
基础服务的目录结构
deploy发布
2、创建微服务user包含子模块 user-provider和user-consumer
user(maven pom,稳定版本1.5.15,不选依赖,自己手动添加)
user-provider(maven project,稳定版本1.5.15,不选依赖,自己手动添加)
user-consumer(maven project,稳定版本1.5.15,不选依赖,自己手动添加)
目录结构如下
3.添加依赖,重点是需要在3个pom文件中配置<modules>和 <parent>标签 ,上下管理关系
user服务的pom文件
<?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>cn.bdqn</groupId>
<artifactId>shop-user</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>shop-user</name>
<description>Demo project for Spring Boot</description>
<modules>
<module>shop-user-provider</module>
<module>shop-user-consumer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.15.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<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>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.5.7</version>
</dependency>
<dependency>
<groupId>cn.bdqn</groupId>
<artifactId>shop-common-module</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.bdqn</groupId>
<artifactId>shop-common-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.bdqn</groupId>
<artifactId>shop-common-dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
user-provider服务的pom文件
<?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>cn.bdqn</groupId>
<artifactId>shop-user-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>shop-user-provider</name>
<description>Demo project for Spring Boot</description>
<parent>
<artifactId>shop-user</artifactId>
<groupId>cn.bdqn</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.7.3</version>
</dependency>
<dependency>
<groupId>cn.bdqn</groupId>
<artifactId>shop-common-dto</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.bdqn</groupId>
<artifactId>shop-common-utils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.bdqn</groupId>
<artifactId>shop-common-service</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.bdqn</groupId>
<artifactId>shop-common-dao</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
user-consumer服务的pom文件
<?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>cn.bdqn</groupId>
<artifactId>shop-user-consumer</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>shop-user-consumer</name>
<description>Demo project for Spring Boot</description>
<parent>
<artifactId>shop-user</artifactId>
<groupId>cn.bdqn</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>cn.bdqn</groupId>
<artifactId>shop-common-dto</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.bdqn</groupId>
<artifactId>shop-common-utils</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
4.配置文件
注意:dubbo配置的不同,一对服务(比如user-provider和user-consumer)的注册中心地址,调用协议地址都是一样的,
应用名肯定是不同的
扫描二维码关注公众号,回复:
2599355 查看本文章
并且server.port均各不相同
2个XX-provider之间的注册中心一般相同,也可以不同,根据实际情况定,调用协议地址不一样,
user-provider配置文件application.yml
#mysql配置
spring:
datasource:
url: jdbc:mysql://192.168.219.128:3306/user_db
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
#redis配置
redis:
database: 0
host: 192.168.219.128
port: 6379
password: 123456
timeout: 3000
pool:
max-active: 8
max-idle: 8
max-wait: -1
min-idle: 0
#dubbo+zookeeper配置
dubbo:
# 应用名
appname: spring-boot-starter-dubbo-user-provider
# 注册中心地址
registry: zookeeper://192.168.219.128:2181
# 调用协议地址
protocol: dubbo
port: 20802
#mybatis配置扫包
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
#tomcat端口
server:
port: 8092
user-consumer配置文件application.yml
#mysql
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.219.128:3306/qg_user_db
username: root
password: root
#redis数据配置
redis:
host: 192.168.219.128
port: 6379
database: 0
password: 123456
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 8
# 连接池中的最小空闲连接
min-idle: 0
timeout: 3000
#dubbo+zookeeper
dubbo:
appname: spring-boot-starter-dubbo-user-consumer
registry: zookeeper://192.168.219.128:2181
protocol: dubbo
port: 20802
#mybatis
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
#tomcat
server:
port: 8082
5.代码实现
5.1provider提供服务
5.1.1provider提供服务service
特别注意注解@Service归属类 ,以及@Autowired(required = true) 调用的基础服务的bean
package cn.bdqn.shopuserprovider.service;
import cn.bdqn.RpcQgUserService;
import cn.bdqn.common.EmptyUtils;
import cn.bdqn.common.RedisUtils;
import cn.bdqn.mapper.QgUserMapper;
import cn.bdqn.pojo.QgUser;
import com.alibaba.dubbo.config.annotation.Service;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
* 提供用户相关服务
*/
@Component
@Service(interfaceClass = RpcQgUserService.class)
public class RpcQgUserServiceImpl implements RpcQgUserService {
@Autowired(required = true)
private QgUserMapper qgUserMapper;
@Autowired
private RedisUtils redisUtils;
/**
* 用户id查找用户
*
* @param id
* @return
* @throws Exception
*/
@Override
public QgUser getQgUserById(String id) throws Exception {
略。。。。
}
5.1.2主程序注解情况
@Import注解是解决RedisUtils注入失败配置的
package cn.bdqn.shopuserprovider;
import cn.bdqn.common.RedisUtils;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.SpringApplication;
import org.springframework.context.annotation.Import;
@SpringBootApplication
@EnableDubboConfiguration//dubbo注册配置
@MapperScan("cn.bdqn.mapper")//mapper扫包
@Import({RedisUtils.class})//注入bean失败,加入本注解
public class ShopUserProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ShopUserProviderApplication.class, args);
}
}
5.2 consumer提供服务
5.2.1 consumer提供服务service
调用远程服务的注解@Reference
package cn.bdqn.shopuserconsumer.service;
import cn.bdqn.RpcQgTokenService;
import cn.bdqn.RpcQgUserService;
import cn.bdqn.common.Constants;
import cn.bdqn.common.RedisUtils;
import cn.bdqn.pojo.QgUser;
import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
/**
*
*/
@Service
public class QgLoginServiceImpl implements QgLoginService {
@Reference
private RpcQgUserService rpcQgUserService;
@Reference
private RpcQgTokenService rpcQgTokenService;
@Autowired
private RedisUtils redisUtils;
@Override
public QgUser login(String phone, String password) throws Exception {
略。。。。。
}
}
5.2.2主程序注解情况
同provider一样 , @Import注解是解决RedisUtils注入失败配置的
5.2.3controller编写
package cn.bdqn.shopuserconsumer.controller;
import cn.bdqn.common.*;
import cn.bdqn.pojo.QgUser;
import cn.bdqn.shopuserconsumer.service.QgLoginService;
import cn.bdqn.vo.TokenVO;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.Calendar;
/**
*
*/
@RestController
@RequestMapping("user")
public class LoginController {
@Resource
private QgLoginService qgLoginService;
// @Resource
// private RedisUtils redisUtils;
@RequestMapping(value = "/login",method = RequestMethod.POST)
public Dto doLogin(@RequestParam String username, @RequestParam String password,
HttpServletRequest request) {
// 用户名和密码有空,直接返回错误
}
}
6 . 增加服务goods时,goods-provider的application.yml文件的配置
注意调用地址和server.port的改变
#mysql
spring:
datasource:
url: jdbc:mysql://192.168.219.128:3306/qg_goods_db
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
#redis
redis:
database: 0
host: 192.168.219.128
port: 6379
password: 123456
timeout: 3000
pool:
max-active: 8
max-idle: 8
max-wait: -1
min-idle: 0
#dubbo+zookeeper
dubbo:
# 应用名称
appname: spring-boot-starter-dubbo-goods-provider
# 注册中心地址
registry: zookeeper://192.168.219.128:2181
#
protocol: dubbo
port: 20803
#mybatis\
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
#tomcat\u7AEF\u53E3
server:
port: 8093
#mysql
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.219.128:3306/qg_goods_db
username: root
password: root
#redis
redis:
host: 192.168.219.128
port: 6379
database: 0
password: 123456
pool:
max-active: 8
max-wait: -1
max-idle: 8
min-idle: 0
timeout: 3000
#dubbo+zookeeper
dubbo:
appname: spring-boot-starter-dubbo-goods-consumer
registry: zookeeper://192.168.219.128:2181
protocol: dubbo
port: 20803
#mybatis
mybatis:
mapper-locations: classpath:mapper/*Mapper.xml
#tomcat\uFFFD\uFFFD\uFFFD\uFFFD
server:
port: 8083