SpringBoot+Dubbo+ZooKeeper+Maven入门实践
原创:转载需注明原创地址 https://www.cnblogs.com/fanerwei222/p/11798626.html
注*** 本实例为仅适合初学者,关于dubbo和springboot以及各种工具的功能介绍就免了,读者可以自行百度,这里仅示范操作.
准备工具(本人所使用工具和版本):
JDK1.8 + tomcat8.5 + springboot 2.2.0.RELEASE + zookeeper-3.4.14 + dubbo-admin-2.5.8 + Lombok插件(idea中搜索) + maven3.6.1
----------------分割线-----------------------------------------
开始!!!
1. 创建一个maven主项目oldhen, 目录结构和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">
<modelVersion>4.0.0</modelVersion> <groupId>com.doubleyolk</groupId>
<artifactId>oldhen</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging> <name>Double Yolk</name>
<description>A Springboot with Dubbo Project</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</version>
</parent> <modules>
<module>model</module>
<module>common</module>
<module>provider</module>
<module>consumer</module>
<module>api</module>
</modules> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<dubbo.version>2.5.5</dubbo.version>
<zkclient.version>0.10</zkclient.version>
<lombok.version>1.18.8</lombok.version>
<spring-boot.version>2.2.0.RELEASE</spring-boot.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>${spring-boot.version}</version>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!-- 使用lombok实现JavaBean的get、set、toString、hashCode、equals等方法的自动生成 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency> <!-- Dubbo依赖 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency> <!--zookeeper的客户端依赖-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency>
</dependencies> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>UTF-8</encoding>
</configuration> </plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
</plugins>
</build> </project>
oldhen-pom.xml
创建完之后配置好pom.xml之后什么都不用管,下一步.
2. 创建model子模块, 目录结构和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">
<modelVersion>4.0.0</modelVersion> <groupId>com.doubleyolk</groupId>
<artifactId>model</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>model</name>
<description>Model module of oldhen</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</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>
<dubbo.version>2.5.5</dubbo.version>
<zkclient.version>0.10</zkclient.version>
<lombok.version>1.18.8</lombok.version>
<spring-boot.version>2.2.0.RELEASE</spring-boot.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> <!-- 使用lombok实现JavaBean的get、set、toString、hashCode、equals等方法的自动生成 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
<scope>provided</scope>
</dependency> </dependencies> </project>
model-pom.xml
Test实体类如下:
package com.oldhen.model.test; import lombok.Data; import java.io.Serializable; /**
* TODO
* TEST 实体
* 使用lombok注解免去set/get,编译的时候会自动写进字节码文件
*/
@Data
public class Test implements Serializable {
private String id;
private String name;
}
Test.java
配置文件可以不需要.
3. 创建common子模块, 目录结构和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"> <groupId>com.doubleyolk</groupId>
<artifactId>common</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging> <modelVersion>4.0.0</modelVersion> <name>common</name>
<description>Common module of oldhen</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</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>
<dubbo.version>2.5.5</dubbo.version>
<zkclient.version>0.10</zkclient.version>
<lombok.version>1.18.8</lombok.version>
<spring-boot.version>2.2.0.RELEASE</spring-boot.version>
</properties> <dependencies> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>model</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <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> </dependencies> </project>
common-pom.xml
TestUtil工具类如下:
package com.oldhen.common.test; import com.oldhen.model.test.Test; /**
* 测试工具类
*/
public class TestUtil { private TestUtil(){} public static void Test(){
Test test = new Test();
}
}
TestUtil.java
4. 创建api子模块, 目录结构和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">
<modelVersion>4.0.0</modelVersion> <groupId>com.doubleyolk</groupId>
<artifactId>api</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>api</name>
<description>Api module of oldhen</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</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>
<dubbo.version>2.5.5</dubbo.version>
<zkclient.version>0.10</zkclient.version>
<lombok.version>1.18.8</lombok.version>
<spring-boot.version>2.2.0.RELEASE</spring-boot.version>
</properties> <dependencies> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>model</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <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> </dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
api-pom.xml
5. 创建consumer(消费者)子模块, 目录结构和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">
<modelVersion>4.0.0</modelVersion> <groupId>com.doubleyolk</groupId>
<artifactId>consumer</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>consumer</name>
<description>Consumer module of oldhen</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</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>
<zkclient.version>0.10</zkclient.version>
<dubbo.version>2.5.5</dubbo.version>
</properties> <dependencies> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>model</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <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> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency> <!--zookeeper的客户端依赖-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency> <dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
consumer-pom.xml
TestConsumer类如下:
package com.oldhen.consumer.test; import com.oldhen.api.test.TestApi;
import com.oldhen.model.test.Test;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List; /**
* TODO
* Test consumer 层
*/
@RestController
public class TestConsumer { @Resource
TestApi testApi; @GetMapping("/test")
public List<Test> findAllTest(HttpServletRequest request){
String param = request.getParameter("param");
System.out.println("********================****************");
System.out.println("it's comming! ");
List<Test> tests = testApi.findAll();
System.out.println("********================****************");
return tests;
}
}
TestConsumer.java
启动类如下:
package com.oldhen.consumer; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource; /**
* 启动类
*/
@ImportResource({"classpath:spring-dubbo-consumer.xml"})
@SpringBootApplication(scanBasePackages = "com.oldhen.consumer.test")
public class ConsumerApplication { public static void main(String[] args) throws InterruptedException {
SpringApplication.run(ConsumerApplication.class, args);
}
}
配置文件application.yml和消费者dubbo配置文件如下:
server:
port: 9093 spring:
datasource:
name: mysql
url: jdbc:mysql://127.0.0.1:3306/oldhen
username: root
password: root
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
application.yml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- dubbo服务名称,需要唯一指定 -->
<dubbo:application name="consumer"/> <!-- dubbo注册在zookeeper上,通过zookeeper实现服务的注册和发布以及订阅 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <!-- 使用dubbo协议和端口 -->
<dubbo:protocol name="dubbo" port="20880"/> <!-- 此处的id要和提供者那边的一致,接口使用api提供的接口即可,避免与提供者代码耦合-->
<dubbo:reference id="testApi" check="false" interface="com.oldhen.api.test.TestApi"/> <!-- dubbo注解扫描路径 -->
<dubbo:annotation package="com.oldhen.consumer.test.**"/> </beans>
spring-dubbo-consumer.xml
6. 创建provider(提供者)子模块, 目录结构和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">
<modelVersion>4.0.0</modelVersion> <groupId>com.doubleyolk</groupId>
<artifactId>provider</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging> <name>provider</name>
<description>Provider module of oldhen</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.0.RELEASE</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>
<zkclient.version>0.10</zkclient.version>
<dubbo.version>2.5.5</dubbo.version>
</properties> <dependencies> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>model</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>api</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <dependency>
<groupId>com.doubleyolk</groupId>
<artifactId>common</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency> <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>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
<exclusions>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency> <dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
</dependency> <!--zookeeper的客户端依赖-->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>${zkclient.version}</version>
</dependency> <dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.16</version>
</dependency>
<!-- alibaba的druid数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
provider-pom.xml
业务层代码:
package com.oldhen.provider.test.biz; import com.alibaba.dubbo.config.annotation.Service;
import com.oldhen.api.test.TestApi;
import com.oldhen.model.test.Test;
import com.oldhen.provider.test.TestProvider; import javax.annotation.Resource;
import java.util.List; /**
* 业务层
*/
@Service
public class TestApiBiz implements TestApi { @Resource
TestProvider testProvider; @Override
public List<Test> findAll() {
// do something return testProvider.findAll();
}
}
TestApiBiz.java
建库建表语句和dao层代码:
CREATE DATABASE
IF
NOT EXISTS oldhen; CREATE TABLE oldhen_model_test ( id INT NOT NULL PRIMARY KEY, NAME VARCHAR ( 20 ) NOT NULL ) ENGINE = INNODB DEFAULT charset = utf8; INSERT INTO oldhen_model_test
VALUES
( 1, "one" );
INSERT INTO oldhen_model_test
VALUES
( 2, "two" );
INSERT INTO oldhen_model_test
VALUES
( 3, "three" );
INSERT INTO oldhen_model_test
VALUES
( 4, "four" );
data.sql
package com.oldhen.provider.test.dao; import com.oldhen.model.test.Test;
import org.springframework.stereotype.Component; import java.util.List; /**
* TODO
* Test dao数据访问层
*/
@Component
public interface TestDao {
List<Test> findAllTest();
}
TestDao.java
<?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.oldhen.provider.test.dao.TestDao">
<resultMap id="test" type="com.oldhen.model.test.Test" >
<!-- 定义主键 ,非常重要。如果是多个字段,则定义多个id -->
<!-- property:主键在pojo中的属性名 -->
<!-- column:主键在数据库中的列名 -->
<id property="id" column="id" /> <!-- 定义普通属性 -->
<result property="name" column="name" />
</resultMap>
<select id="findAllTest" resultType="com.oldhen.model.test.Test">
select mt.* from oldhen_model_test mt
</select>
</mapper>
TestDao.xml
service层代码:
package com.oldhen.provider.test; import com.oldhen.model.test.Test; import java.util.List; /**
* TODO
* Test provider 服务层
*/
public interface TestProvider {
List<Test> findAll();
}
TestProvider.java
package com.oldhen.provider.test.impl; import com.alibaba.dubbo.config.annotation.Service;
import com.oldhen.model.test.Test;
import com.oldhen.provider.test.TestProvider;
import com.oldhen.provider.test.dao.TestDao; import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List; /**
* 服务实现类
*/
@Service
public class TestProviderImpl implements TestProvider { @Resource
TestDao dao; @Override
public List<Test> findAll() {
Test test = new Test();
test.setId("1");
test.setName("hello");
List<Test> tests = new ArrayList<>();
tests.add(test);
return dao.findAllTest();
}
}
TestProviderImpl.java
启动类和配置文件:
package com.oldhen.provider; import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource; /**
* 启动类
* MapperScan扫描mapperxml文件
*/
@SpringBootApplication
@MapperScan("com.oldhen.provider.test.dao")
@ImportResource({"classpath:spring-dubbo-provider.xml"})
public class ProviderApplication { public static void main(String[] args) throws InterruptedException {
SpringApplication.run(ProviderApplication.class, args);
/**
* 防止提供者程序中断或停止导致消费者无法调用
* 如果提供者主程序跑完了zookeeper也会中断(原因未知)
*/
synchronized (ProviderApplication.class){
while (true){
ProviderApplication.class.wait();
}
}
}
}
server:
port: 9099 spring:
datasource:
name: mysql
url: jdbc:mysql://127.0.0.1:3306/oldhen?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username: root
password: root
# 使用druid数据源
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
filters: stat
maxActive: 20
initialSize: 1
maxWait: 60000
minIdle: 1
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxOpenPreparedStatements: 20
mybatis:
# type-aliases-package: domain
# 指定全局配置文件位置
# config-location: classpath:mybatis/mybatis-config.xml
# 指定sql映射文件位置
mapper-locations: classpath:mapper/*.xml
application.yml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!-- dubbo服务名称,需要唯一指定 -->
<dubbo:application name="provider"/> <!-- zookeeper注册中心的ip地址 -->
<dubbo:registry protocol="zookeeper" address="127.0.0.1:2181" /> <!-- 扫描注解包路径,多个包用逗号分隔,不填pacakge表示扫描当前ApplicationContext中所有的类 -->
<dubbo:annotation package="com.oldhen.provider.test.impl.**" /> <!-- 使用dubbo协议并且将服务发布在20880端口 -->
<dubbo:protocol name="dubbo" port="20880" /> <!-- 定义实际的api实现类, 具体的功能实现都在在这里,此处的id要和消费者那边的一致 -->
<bean id="testProviderApiBiz" class="com.oldhen.provider.test.biz.TestApiBiz"/> <!-- 发布api接口服务, 实际引用的实现类时上面那个,消费者只要调用这个接口就能直接调用实现类的方法和功能 -->
<dubbo:service interface="com.oldhen.api.test.TestApi" ref="testProviderApiBiz"/>
</beans>
spring-dubbo-provider.xml
7. Zookeeper的配置文件:
tickTime=2000
initLimit=10
syncLimit=5
#文件存储路径,如果是linux则修改为/tmp或者对应的路径
dataDir=D:/tmp/zookeeper
#服务端口,和java中的配置一致即可
clientPort=2181
至此,准备工作已经完毕了!开始运行程序!
a) 执行zookeeper-3.4.14\bin目录下的zkServer.cmd, 本人是win系统,linux运行zkServer.sh即可;将dubbo-admin源码下载下来之后,执行mvn compile, 再执行mvn package打包,然后将打出来的war包放入tomcat中运行即可,此处不作过多讲解.
b) 数据库开起来, 执行sql文件创建数据库和数据表和插入数据;
c) 首先运行提供者的启动类;
d) 其次运行消费者的启动类;
e) 通过访问浏览器 http://192.168.137.1:9093/test/ 来查看是否返回如下数据:
[{"id":"1","name":"one"},{"id":"2","name":"two"},{"id":"3","name":"three"},{"id":"4","name":"four"}]
f) 有的话代表成功了! 没有的话请检查上述工具的版本是否对应!以及是否启动成功!
g) 具体的服务是否启动可以登录 http://127.0.0.1:9090/dubbo-admin-2.5.8 输入用户名root密码root进行登录查看
查看相应的服务是否启动即可!没有启动的话请检查环境(jdk版本, Zookeeper版本, dubbo-admin版本)是否正确!缺一不可,请不要随意改动pom文件,否则也可能出现各种兼容性问题导致程序无法运行!
总结: 整体的思路就是消费者通过实现api层提供的接口来访问接口里面的方法, 这其中消费者不需要关注其他事情,只需要将自己和Zookeeper绑定起来获取Zookeeper上发布的提供者服务即可, 提供者也是通过实现api层提供的接口来实现相应的对数据库访问操作,从而返回数据给消费者,这其中它也不需要关注其他事情,只需要将自己的服务注册发布到Zookeeper上由Zookeeper来给别的服务提供服务,提供者只需要关注自己的业务实现即可,当然model层和common层独立出来可以供消费者和提供者以及api层共同使用,无需重复写JavaBean.
附上笔记图:
- oldhen 主项目
- model 实体层(提供一般的实体类编写,采用lombok来实现去set/get化)
- common 通用层(用来提供工具类或者通用的一些组件等功能)
- api 接口层(主要是用来解耦consumer和provider, 消费者和提供者同时实现api中的接口,提供者进行发布该服务给消费者获取使用)
- consumer 消费层(调用provider, 可以理解为普通的controller层)
- provider 最终提供服务层(为consumer提供服务, 主要是集成了service,mapper/dao 层以及biz(对service进行包装和业务处理的业务层))
provider可以有多个例如 : 订单服务, 用户管理服务, 商品管理服务, 抢购服务, 购物车服务, 支付服务, 评论服务, 会员服务, 搜索服务, 秒杀服务等等模块
consumer也可以针对不同的服务增加不同的消费者,例如: 订单服务消费者, 用户管理服务消费者, 商品管理服务消费者等等.
整体架构示意如下:
前端(网站/APP) --> dubbo --> 服务层(privider中的各种服务, 通过consumer调用)
(并列于服务层的下一级)--> 数据访问层 --> 关系型数据库管理器(mycat数据库分片) --> 多个关系型数据库(多个mysql)
(并列于服务层的下一级)--> 缓存(Redis集群) --> 多个缓存服务(多个redis)
(并列于服务层的下一级)--> MQ消息队列 --> 通用支撑系统(推送等)
(并列于服务层的下一级)--> 搜索服务集群 --> 多个搜索服务
管理后台(网站) --> dubbo --> 服务层(privider中的各种服务, 通过consumer调用)
(并列于服务层的下一级)--> 数据访问层 --> 关系型数据库管理器(mycat数据库分片) --> 多个关系型数据库(多个mysql)
(并列于服务层的下一级)--> 缓存(Redis集群) --> 多个缓存服务(多个redis)
(并列于服务层的下一级)--> MQ消息队列 --> 通用支撑系统(推送等)
(并列于服务层的下一级)--> 搜索服务集群 --> 多个搜索服
有问题可以在下方留言,可以贴上错误代码!
SpringBoot+Dubbo+ZooKeeper+Maven入门实践的更多相关文章
- 搭建SpringBoot+dubbo+zookeeper+maven框架(二)
上一篇文章是关于搭建SpringBoot+dubbo+zookeeper+maven框架的,但是里面的功能还不够完善,今天就日志管理方面做一些改善. 下了demo的网友可能会发现项目在启动时会有警告: ...
- 搭建SpringBoot+dubbo+zookeeper+maven框架(一)
这几天项目还没来,所以就自己试着参考网上的一些资料,搭建了一个SpringBoot+dubbo+zookeeper+maven框架,网上参考的很多资料照着他们一步一步搭建,最后很多都运行不通,很是郁闷 ...
- springboot+dubbo+zookeeper微服务实践demo
微服务化越来越火,实际上是应互联网时代而生的,微服务化带来的不仅是性能上的提升,更带来了研发组织的更加便利,协作更加轻松,团队效能更高. 当然不能为了技术而技术,我们需要切合实际的对业务进行划分,降低 ...
- 搭建SpringBoot+dubbo+zookeeper+maven框架(四)
今天我们完成框架的thymeleaf模板显示页面功能,页面的用户登陆,密码的AES加密解密,输错3次进行验证码验证功能,东西可能比较多,这个是我这两天在网上结合各种资源整合出来的,基本功能都已经实现, ...
- 搭建SpringBoot+dubbo+zookeeper+maven框架(三)
今天我们要在原来搭建的框架基础上集成redis数据库. redis是Nosql数据库中使用较为广泛的非关系型内存数据库,redis内部是一个key-value存储系统.它支持存储的value类型相对更 ...
- springboot+dubbo+zookeeper+mybatis
参考地址:https://www.cnblogs.com/gaopengfirst/p/9555240.html 首先创建一个maven项目: 再在该父项目中创建3个module,分别是:provid ...
- 高可用架构的实现--dubbo+zookeeper+maven+tomcat
最近在做分布式的服务架构搭建,因为自己确实很喜欢搞这种技术类的研究,所以在公司需要的时候主动承担了这项光荣而艰巨的任务.公司搭建的架构主要目的是需要支持后端接口的多用户的高并发访问,希望能够达到每秒并 ...
- SpringBoot + Dubbo + zookeeper 搭建简单分布式服务
SpringBoot + Dubbo + zookeeper 搭建简单分布式服务 详细操作及源码见: https://github.com/BillyYangOne/dubbo-springboot
- SpringBoot+Dubbo+Zookeeper 实例
前言 当下Java 生态环境里面,微服务占据了非常大的份额,现在大部分新开发的 Java选型的后台程序都很奇妙的会跟微服务发生一些关系.那目前市面上主流的微服务方向主要有 Spring 家族推出的Sp ...
随机推荐
- Java中List与数组互相转换
1.说明 在Java中,经常遇到需要List与数组互相转换的场景. List转换成数组,可以使用List的toArray()或者toArray(T[] a)方法. 数组转换成List,可以使用Arra ...
- Django_MVT(二)
一.MVT简介 M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理. V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返回应答. T全拼为Template,与 ...
- Python 元类实现ORM
ORM概念 ORM(Object Ralational Mapping,对象关系映射)用来把对象模型表示的对象映射到基于 SQL 的关系模型数据库结构中去.这样,我们在具体的操作实体对象的时候,就不 ...
- 前后端分离 导致的 静态页面 加载 <script type="module" > 报CORS 跨域错误,提示 blocked by CORS policy
1.前言 静态页面 加载 <script type="module" > 报CORS 跨域错误,提示Access to script at ftp:///xxx.js ...
- Oracle 报 ORA-00054资源正忙的解决办法
oracle之报错:ORA-00054: 资源正忙,要求指定 NOWAIT 问题如下: SQL> conn scott/tiger@vm_database Connected to Oracle ...
- js几种常见排序的实现
1. 冒泡排序 定义: 比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个 数据交换. 这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就"沉"到数组第 ...
- 第10组 Beta冲刺 (2/5)(组长)
1.1基本情况 ·队名:今晚不睡觉 ·组长博客:https://www.cnblogs.com/cpandbb/p/14015412.html ·作业博客:https://edu.cnblogs.co ...
- 自定义异步爬虫架构 - AsyncSpider
作者:张亚飞 山西医科大学在读研究生 1. 并发编程 Python中实现并发编程的三种方案:多线程.多进程和异步I/O.并发编程的好处在于可以提升程序的执行效率以及改善用户体验:坏处在于并发的程序不容 ...
- layui type:2 iframe子页面向父页面传值
需求: 选择子页面表格中的radio或者双击该行,得到的该行数据传到父页面,由父页面渲染. 网上的各种方法都用了,父页面就是获取不到子页面传的值,过了一晚上,睡了一觉,柳暗花明又一村. layui t ...
- 利用python绘制分析路易斯安那州巴吞鲁日市的人口密度格局
前言 数据来源于王法辉教授的GIS和数量方法,以后有空,我会利用python来实现里面的案例,这里向王法辉教授致敬. 绘制普查人口密度格局 使用属性查询提取区边界 import numpy as np ...