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 ...
随机推荐
- MySQL数据库安装Version5.5
1.新建mysql用户 useradd -g hadoop -s /bin/bash -md /home/mysql mysql 创建.bash_profile,加载.bashrc 2.检查并且卸载系 ...
- Android 悬浮窗 System Alert Window
悬浮窗能显示在其他应用上方.桌面系统例如Windows,macOS,Ubuntu,打开的程序能以窗口形式显示在屏幕上. 受限于屏幕大小,安卓系统中主要使用多任务切换的方式和分屏的方式.视频播放,视频对 ...
- CSS基础 margin塌陷问题以及解决 办法
场景:两个相互嵌套的块级元素,父子元素相互紧贴margin-top会合并作用在父元素的子元素结果:导致两个盒子同时移动 解决方法: 1.给父元素设置overflow:hidden 2.给父元素设置浮动 ...
- 接口调试没有登录态?用whistle帮你解决
页面的域名是 a.com,接口的域名为 b.com,这是跨域的因此不会将 cookie 带过去的,也就没有登录态. 解决方法:利用 whistle 的 composer 功能. whistle git ...
- 欢迎收看 Flink Forward Asia 2021 峰会直播
在线收看地址:https://developer.aliyun.com/special/ffa2021/live#?utm_content=g_1000316459 Flink 是由 Apache 软 ...
- monkey怎么做APP自动化?
前言: monkey是andriod平台自动化测试的一种手段,通过monkey程序模拟触摸屏幕.滑动,滚屏,按键来对设备进行压力测试,检测程序多久会出现异常第一种:设置好命令,做随机自动化 什么时候可 ...
- spring cloud --- config 从git 获取文件【 可能是yml或 properties】遇到有相同字段的取值规则
spring boot 1.5.9.RELEASE spring cloud Dalston.SR1 1.前言 昨天做了 spring cloud config 配置中心 获取存在gi ...
- java中的spi
JAVA中的SPI机制 1.SPI简介 SPI机制(Service Provider Interface)其实源自服务提供者框架(Service Provider Framework),是一种将服务接 ...
- mysql按照时间分组查询
mysql 按年.月.周.日分组查询 1.按照年份分组查询 SELECT DATE_FORMAT(t.bill_time,'%Y') month_time,sum(t.pay_price) total ...
- kubernetes运行应用2之DaemonSet详解
kubernetes运行应用1之Deployment详解 查看daemonset 如下,k8s自身的 DaemonSet kube-flannel-ds和kube-proxy分别负责在每个结点上运 ...