原創:轉載需註明原創地址 http://www.javashuo.com/article/p-aehwoyho-g.html
注*** 本實例爲僅適合初學者,關於dubbo和springboot以及各類工具的功能介紹就免了,讀者能夠自行百度,這裏僅示範操做.
html
準備工具(本人所使用工具和版本):前端
JDK1.8 + tomcat8.5 + springboot 2.2.0.RELEASE + zookeeper-3.4.14 + dubbo-admin-2.5.8 + Lombok插件(idea中搜索) + maven3.6.1java
----------------分割線-----------------------------------------mysql
開始!!!linux
1. 建立一個maven主項目oldhen, 目錄結構和pom.xml以下: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 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>
建立完以後配置好pom.xml以後什麼都不用管,下一步.redis
2. 建立model子模塊, 目錄結構和pom.xml以下:spring
<?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>
Test實體類以下:sql
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; }
配置文件能夠不須要.數據庫
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>
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(); } }
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>
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>
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; } }
啓動類以下:
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
<?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>
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>
業務層代碼:
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(); } }
建庫建表語句和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" );
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(); }
<?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>
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(); }
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(); } }
啓動類和配置文件:
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
<?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>
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消息隊列 --> 通用支撐系統(推送等)
(並列於服務層的下一級)--> 搜索服務集羣 --> 多個搜索服
有問題能夠在下方留言,能夠貼上錯誤代碼!