Spring Boot集成Dubbo 並且使用使用zookeeper作爲註冊中心
前言
本文全程在Windos下操作,大致操作與Linux相差無異,具體細節請百度,有條件的可以谷歌!
需要了解的知識點
- Dubbo 和 zookeeper 環境以及瞭解這兩個是個什麼東東
- Spring Boot 知識點,僅限於包結構 pom依賴 繼承等
- Maven 聚合工程
- JDK 和 tomcat 環境配置等
首先環境配置
JDK 8
Maven 3.x
Spring Boot 1.5.22
tomcat 8.x
Mysql 5.5
dubbo 2.5.4
zookeeper 3.5.8
關於Dubbo 、zookeeper 以及微服務是什麼東西,請百度,如不知道就不要往下看了。
首選需要了解和安裝Dubbo 和 zookeeper 環境 可以查看 Windows下搭建dubbo和zookeeper環境
搭建Maven聚合項目
先新建父級工程
輸入項目名和groupid 和 ArtifactId
然後在父級包上右鍵新建Module
如下圖,點擊完成即可。
等等新建結束後點擊父級pom
可以看到子maven模塊
項目結構
新建後的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>com.gamll</groupId>
<artifactId>gamll-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<description>父級maven</description>
<modules>
<module>gmall-api</module>
<!-- <module>gmall_user</module>-->
<module>gmall-common-util</module>
<module>service-util</module>
<module>gmall-user-service-dir/gmall-user-service</module>
<module>gmall-user-service-dir/gmall-user-web</module>
</modules>
</project>
引入Spring Boot 依賴後 和 部分依賴後,依賴維護
<?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.gamll</groupId>
<artifactId>gamll-parent</artifactId>
<version>1.0-SNAPSHOT</version>
<description>父級maven</description>
<modules>
<module>gmall-api</module>
<!-- <module>gmall_user</module>-->
<module>gmall-common-util</module>
<module>service-util</module>
<module>gmall-user-service-dir/gmall-user-service</module>
<module>gmall-user-service-dir/gmall-user-web</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.22.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<packaging>pom</packaging>
<!-- 定義依賴版本 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<fastjson.version>1.2.46</fastjson.version>
<dubbo-starter.version>1.0.10</dubbo-starter.version>
<dubbo.version>2.6.0</dubbo.version>
<zkclient.version>0.10</zkclient.version>
<mybatis.version>1.3.1</mybatis.version>
<nekohtml.version>1.9.20</nekohtml.version>
<xml-apis.version>1.4.01</xml-apis.version>
<batik-ext.version>1.9.1</batik-ext.version>
<jsoup.version>1.11.2</jsoup.version>
<httpclient.version>4.5.5</httpclient.version>
<commons-lang3.version>3.7</commons-lang3.version>
<mapper-starter.version>1.2.3</mapper-starter.version>
<jedis.version>2.9.0</jedis.version>
<jest.version>5.3.2</jest.version>
<jna.version>4.5.1</jna.version>
<beanUtils.version>1.9.3</beanUtils.version>
</properties>
<!--依賴維護-->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
<dependency>
<groupId>com.gitee.reger</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>${dubbo-starter.version}</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.version}</version>
</dependency>
<dependency>
<groupId>net.sourceforge.nekohtml</groupId>
<artifactId>nekohtml</artifactId>
<version>${nekohtml.version}</version>
</dependency>
<dependency>
<groupId>xml-apis</groupId>
<artifactId>xml-apis</artifactId>
<version>${xml-apis.version}</version>
</dependency>
<dependency>
<groupId>org.apache.xmlgraphics</groupId>
<artifactId>batik-ext</artifactId>
<version>${batik-ext.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>${jsoup.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>${httpclient.version}</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${commons-lang3.version}</version>
</dependency>
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>${mapper-starter.version}</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>${jedis.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/io.searchbox/jest -->
<dependency>
<groupId>io.searchbox</groupId>
<artifactId>jest</artifactId>
<version>${jest.version}</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
<dependency>
<groupId>net.java.dev.jna</groupId>
<artifactId>jna</artifactId>
<version>${jna.version}</version>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
<version>${beanUtils.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
gmall-api
存放實體類,和定義service接口
gmall-common-util
存放一些通用的工具方法以及service和controller都通用的依賴
service-util
存放service需要的一些依賴 比如數據庫驅動 redis等。
然後gmall-user-service-dir 文件夾存放 dubbo 服務提供者和消費者
新建如上所示
gmall-user-service 服務提供者
gmall-user-web 消費者
以上每個子模塊 中繼承父級的pom依賴
<parent>
<artifactId>gamll-parent</artifactId>
<groupId>com.gamll</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
這裏只貼gmall-common-util的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">
<!-- 繼承父級的maven依賴-- >
<parent>
<artifactId>gamll-parent</artifactId>
<groupId>com.gamll</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>gmall-common-util</artifactId>
</project>
各模塊引入自己的依賴jar
gmall-common-util
<?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>gamll-parent</artifactId>
<groupId>com.gamll</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>gmall-common-util</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>commons-beanutils</groupId>
<artifactId>commons-beanutils</artifactId>
</dependency>
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
</dependency>
<!--dubbo框架依賴-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
</dependency>
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<!--排除log4g12日誌-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
<!--與sb整合 dubbo-->
<dependency>
<groupId>com.gitee.reger</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
</dependency>
</dependencies>
</project>
gmall-api
<?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>gamll-parent</artifactId>
<groupId>com.gamll</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>gmall-api</artifactId>
<description>用戶實體類服務</description>
<dependencies>
<!--通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
gmall-user-service
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>gamll-parent</artifactId>
<groupId>com.gamll</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<groupId>com.gmall</groupId>
<artifactId>gmall-user-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gmall-user-service</name>
<description>用戶服務生產者 , 也就是dubbo 提供端</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.gamll</groupId>
<artifactId>gmall-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.gamll</groupId>
<artifactId>service-util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.gmalluser</groupId>
<artifactId>gmall_user</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>
gmall-user-web
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>gamll-parent</artifactId>
<groupId>com.gamll</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.gmall</groupId>
<artifactId>gmall-user-web</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gmall-user-web</name>
<description>用戶服務消費者 也就是dubbo 消費端 對外的接口</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>com.gamll</groupId>
<artifactId>gmall-api</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>com.gamll</groupId>
<artifactId>service-util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- Description:
Cannot determine embedded database driver class for database type NONE-->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
service-util
<?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>gamll-parent</artifactId>
<groupId>com.gamll</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>service-util</artifactId>
<dependencies>
<dependency>
<groupId>com.gamll</groupId>
<artifactId>gmall-common-util</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
</dependency>
<!--通用mapper -->
<!-- <dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.3</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</exclusion>
</exclusions>
</dependency>
-->
</dependencies>
</project>
搭建dobbo提供者和消費者
maven子模塊服務提供者gmall-user-service
和消費者 gmall-user-web
服務提供者
這裏面新建 數據庫訪問 和 和 service實現類 同時在yml裏配置將服務註冊到 中
UmsMemberMapper
這裏面提供dao查詢接口 繼承通用mapper接口
實體類依賴在gmall-api
模塊中
Mapper依賴在service-util
模塊中
@Mapper
public interface UmsMemberMapper extends tk.mybatis.mapper.common.Mapper<UmsMember> {
/**
* 查詢所有
* @return
*/
List<UmsMember> selectAllUmsMebers();
}
UmsMemberMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.gmall.gmall.user.service.dao.UmsMemberMapper">
<resultMap id="BaseResultMap" type="com.gamll.api.bean.UmsMember">
<id column="id" property="id" jdbcType="BIGINT"/>
<result column="member_level_id" property="memberLevelId" jdbcType="BIGINT"/>
<result column="username" property="username" jdbcType="VARCHAR"/>
<result column="password" property="password" jdbcType="VARCHAR"/>
<result column="nickname" property="nickname" jdbcType="VARCHAR"/>
<result column="phone" property="phone" jdbcType="VARCHAR"/>
<result column="status" property="status" jdbcType="INTEGER"/>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"/>
<result column="icon" property="icon" jdbcType="VARCHAR"/>
<result column="gender" property="gender" jdbcType="INTEGER"/>
<result column="birthday" property="birthday" jdbcType="DATE"/>
<result column="city" property="city" jdbcType="VARCHAR"/>
<result column="job" property="job" jdbcType="VARCHAR"/>
<result column="personalized_signature" property="personalizedSignature" jdbcType="VARCHAR"/>
<result column="source_type" property="sourceType" jdbcType="INTEGER"/>
<result column="integration" property="integration" jdbcType="INTEGER"/>
<result column="growth" property="growth" jdbcType="INTEGER"/>
<result column="luckey_count" property="luckeyCount" jdbcType="INTEGER"/>
<result column="history_integration" property="historyIntegration" jdbcType="INTEGER"/>
</resultMap>
<sql id="Base_Column_List">
id, member_level_id, username, password, nickname, phone, status, create_time, icon,
gender, birthday, city, job, personalized_signature, source_type, integration, growth,
luckey_count, history_integration
</sql>
<!-- 查詢所有-->
<select id="selectAllUmsMebers" resultType="com.gamll.api.bean.UmsMember">
select
<include refid="Base_Column_List"/>
from ums_member
</select>
</mapper>
ums_member sql語句
CREATE TABLE `ums_member` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`member_level_id` bigint(20) DEFAULT NULL,
`username` varchar(64) DEFAULT NULL COMMENT '用戶名',
`password` varchar(64) DEFAULT NULL COMMENT '密碼',
`nickname` varchar(64) DEFAULT NULL COMMENT '暱稱',
`phone` varchar(64) DEFAULT NULL COMMENT '手機號碼',
`status` int(1) DEFAULT NULL COMMENT '帳號啓用狀態:0->禁用;1->啓用',
`create_time` datetime DEFAULT NULL COMMENT '註冊時間',
`icon` varchar(500) DEFAULT NULL COMMENT '頭像',
`gender` int(1) DEFAULT NULL COMMENT '性別:0->未知;1->男;2->女',
`birthday` date DEFAULT NULL COMMENT '生日',
`city` varchar(64) DEFAULT NULL COMMENT '所做城市',
`job` varchar(100) DEFAULT NULL COMMENT '職業',
`personalized_signature` varchar(200) DEFAULT NULL COMMENT '個性簽名',
`source_type` int(1) DEFAULT NULL COMMENT '用戶來源',
`integration` int(11) DEFAULT NULL COMMENT '積分',
`growth` int(11) DEFAULT NULL COMMENT '成長值',
`luckey_count` int(11) DEFAULT NULL COMMENT '剩餘抽獎次數',
`history_integration` int(11) DEFAULT NULL COMMENT '歷史積分數量',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_username` (`username`),
UNIQUE KEY `idx_phone` (`phone`)
) ENGINE=InnoDB AUTO_INCREMENT=11 DEFAULT CHARSET=utf8 COMMENT='會員表';
服務提供者類
UmsMemberServiceImpl
需要注意的是以前我們在單體服務中 service實現類採用Spring 提供的@service
註解將bean注入到IOC容器中
但現在我們是用dubbo實現微服務,需要使用dubbo的@service
註解將該服務註冊到zookeeper中,讓消費者從容器中獲取進行消費。
顧名思義就是提供服務供別人調用的,相當於spring中的Service的實現類。 使用也很簡單,就是一個註解加一份配置 提供端在實現類上增加註解 @Service,和spring的是一樣的但是引的包是不一樣的。
package com.gmall.gmall.user.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.gamll.api.bean.UmsMember;
import com.gamll.api.service.UmsMemberService;
import com.gmall.gmall.user.service.dao.UmsMemberMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service //這裏@Service 註解需要使用dubbo 的註解
public class UmsMemberServiceImpl implements UmsMemberService {
@Autowired
private UmsMemberMapper umsMemberMapper;
@Override
public List<UmsMember> getUmsMemberList() {
return umsMemberMapper.selectAllUmsMebers();
}
@Override
public UmsMember findUmsMemberById(long id) {
return umsMemberMapper.selectByPrimaryKey(id);
}
@Override
@Transactional(rollbackFor = {Exception.class,RuntimeException.class})
public int addUmsMember(UmsMember umb) {
return umsMemberMapper.insert(umb);
}
@Override
@Transactional(rollbackFor = {Exception.class,RuntimeException.class})
public int updateUmsMember(UmsMember umb) {
return umsMemberMapper.updateByPrimaryKey(umb);
}
}
main方法
需要開啓Mapper掃描 這裏使用了通用Mapper 必須用到通用mapper的@MapperScan
註解掃描mapper
以及開啓事務
@SpringBootApplication
@tk.mybatis.spring.annotation.MapperScan("com.gmall.gmall.user.service.dao")
@EnableTransactionManagement
public class GmallUserServiceApplication {
public static void main(String[] args) {
SpringApplication.run(GmallUserServiceApplication.class, args);
}
}
最後yml中配置註冊中心以及dubbo中的服務信息以及mybatis的配置
server:
port: 10002
spring:
datasource:
url: jdbc:mysql://127.0.0.1:3306/gmall0105?useunicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: root
driver-class-name: com.mysql.jdbc.Driver
dubbo:
# dubbo中的服務名稱
application:
name: user-service-server
protocol:
# dubbo中的通信協議名稱
name: dubbo
registry:
# zookeeper註冊中心的地址加端口號
address: 127.0.0.1:2181
# zookeeper註冊中心協議
protocol: zookeeper
# dubbo的服務掃描路徑
base-package: com.gmall
#mybatis 映射 xml和pojo映射
mybatis:
type-aliases-package: com.gmalluser.pojo
mapper-locations: classpath:mapper/*.xml
logging:
level: debug
最後啓動一下Spring Boot
別忘了啓動dubbo和zookeeper
可以看到已經將服務註冊到zookeeper中了
打開dubbo服務監控頁面
可以看到服務提供者
服務消費者
上面已經將服務註冊到zookeeper中了,這裏我們將服務拿出來進行消費
首先配置Yml
配置註冊地址端口等協議
server:
port: 10003
spring:
dubbo:
# dubbo中的服務名稱
application:
name: user-web
protocol:
# dubbo中的通信協議名稱
name: dubbo
registry:
# zookeeper註冊中心的地址加端口號
address: 127.0.0.1:2181
# zookeeper註冊中心協議
protocol: zookeeper
# dubbo的服務掃描路徑
base-package: com.gmall
consumer:
# 訪問提供端服務的超時時間,默認是1000毫秒
timeout: 30000
# 是啓動消費端時,是否檢查服務端能否正常訪問。如果選擇true,那啓動消費端時,必須保證提供端服務正常,否則接口無法注入
check: false
UmsMemberController
新建controller 消費服務查詢數據
以前在單體中我們是從IOC容器中將bean拿出來然後調用方法進行查詢,但在dubbo分佈式項目中是用dubbo 的service 也就是用@Reference
將服務從zookeeper拿出來,注入到controller中 然後調用指定方法進行查詢
@RequestMapping("/api/umb")
@RestController
public class UmsMemberController {
//dubbo 的service
@Reference
private UmsMemberService umsMemberService;
@RequestMapping("/findAll")
public List<UmsMember> all() {
return umsMemberService.getUmsMemberList();
}
@RequestMapping("/findById")
public UmsMember all(long id) {
return umsMemberService.findUmsMemberById(id);
}
}
然後啓動消費者
如果啓動報錯
java.lang.reflect.InvocationTargetException: null
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_181]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_181]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_181]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_181]
at com.alibaba.dubbo.config.AbstractConfig.toString(AbstractConfig.java:474) ~[dubbo-2.6.2.jar:2.6.2]
at java.lang.String.valueOf(String.java:2994) [na:1.8.0_181]
at java.lang.StringBuilder.append(StringBuilder.java:131) [na:1.8.0_181]
at com.alibaba.dubbo.config.spring.beans.factory.annotation.AbstractAnnotationConfigBeanBuilder.build(AbstractAnnotationConfigBeanBuilder.java:79) [dubbo-2.6.2.jar:2.6.2]
at com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.buildReferenceBean(ReferenceAnnotationBeanPostProcessor.java:385) [dubbo-2.6.2.jar:2.6.2]
at com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.access$100(ReferenceAnnotationBeanPostProcessor.java:65) [dubbo-2.6.2.jar:2.6.2]
at com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor$ReferenceFieldElement.inject(ReferenceAnnotationBeanPostProcessor.java:363) [dubbo-2.6.2.jar:2.6.2]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at com.alibaba.dubbo.config.spring.beans.factory.annotation.ReferenceAnnotationBeanPostProcessor.postProcessPropertyValues(ReferenceAnnotationBeanPostProcessor.java:92) [dubbo-2.6.2.jar:2.6.2]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1400) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.config.DependencyDescriptor.resolveCandidate(DependencyDescriptor.java:277) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1247) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1167) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor$AutowiredFieldElement.inject(AutowiredAnnotationBeanPostProcessor.java:593) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:90) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:374) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1395) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:592) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:515) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:320) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:318) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) [spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:849) ~[spring-beans-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:877) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:549) ~[spring-context-5.1.5.RELEASE.jar:5.1.5.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:142) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:775) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:397) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:316) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1260) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1248) ~[spring-boot-2.1.3.RELEASE.jar:2.1.3.RELEASE]
at com.springboot.dubbo.DubboApplication.main(DubboApplication.java:12) ~[classes/:na]
Caused by: java.lang.IllegalStateException: Failed to check the status of the service com.spring.boot.service.UserService. No provider available for the service com.spring.boot.service.UserService from the url zookeeper://127.0.0.1:2181/com.alibaba.dubbo.registry.RegistryService?application=spring-boot-dubbo-consumer&dubbo=2.6.2&interface=com.spring.boot.service.UserService&methods=getUser&pid=40168®ister.ip=192.168.1.5&side=consumer×tamp=1553586960033 to the consumer 192.168.1.5 use dubbo version 2.6.2
at com.alibaba.dubbo.config.ReferenceConfig.createProxy(ReferenceConfig.java:422) ~[dubbo-2.6.2.jar:2.6.2]
at com.alibaba.dubbo.config.ReferenceConfig.init(ReferenceConfig.java:333) ~[dubbo-2.6.2.jar:2.6.2]
at com.alibaba.dubbo.config.ReferenceConfig.get(ReferenceConfig.java:163) ~[dubbo-2.6.2.jar:2.6.2]
at com.alibaba.dubbo.config.spring.ReferenceBean.getObject(ReferenceBean.java:66) ~[dubbo-2.6.2.jar:2.6.2]
... 43 common frames omitted
是因爲 main方法上服務提供者的主類上沒有配置註解
@SpringBootApplication
@EnableDubbo
public class GmallUserWebApplication {
public static void main(String[] args) {
SpringApplication.run(GmallUserWebApplication.class, args);
}
}
然後啓動即可
可以發現成功註冊
調用查詢接口測試
發現成功查詢出數據
分佈式就可以基於這種方式實現不同模塊間的調用。每一個實現服務的消費端和提供端分離。
dubbo和zookeeper分佈式架構
執行流程:
- Provider:服務的提供者,負責對外提供服務,提供者在啓動的時候,需要向Registry註冊自己能夠提供
的服務 - Consumer:服務的消費者,消費者在啓動的時候,需要向Registry訂閱自己需要的服務
- Registry:註冊中心,授受註冊和訂閱,會異步的通知訂閱者,向消費者提供服務列表
當消費者需要執行遠程過程調用時,會從Registry獲取到服務地址列表(基於負載均衡算法)進行調用,
如果調用失敗會重新選擇新的提供者再次調用 - Monitor:監控中心,統計服務的調用次數和調用時間,服務消費者和提供者會在內存中累計調用次數和
調用時間,定時每分鐘向監控中心發送一次統計數據