項目地址:https://gitee.com/QNKCDZ0/WenDev-Microservice
為什么要做微服務?
最初的目的其實很簡單——好奇懊⑽小!整天聽說微服務有多么多么厲害卖漫,在大型項目上的表現有多么多么好费尽。本著“既然好奇那就一定要自己試一試”的心態(tài),開搞了羊始。
為什么使用Spring Cloud旱幼?
目前在Java微服務領域,比較成熟的全套解決方案非Spring Cloud莫屬了突委。既然初學柏卤,還是從比較簡單的開始。
為什么使用Spring Cloud Alibaba?
之前匀油,Spring Cloud的主流解決方案基本都是使用Netflix的那一套缘缚,但是Eureka閉源、Hystrix停止更新敌蚜,以及Zuul 1.x性能不是很好讓我覺得只用Netflix那一套肯定是不行的桥滨。正好,阿里也為Spring Cloud提供了一套完整的解決方案弛车,所以就選擇了Spring Cloud Alibaba齐媒。
正式開始!
Spring Cloud我選擇了最新的Hoxton
版本(或者應該叫H版纷跛?)喻括。
創(chuàng)建一個父工程wendev-parent
,用于整個項目的依賴管理和模塊管理忽舟。
創(chuàng)建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>site.wendev.microservice</groupId>
<artifactId>wendev-microservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<junit.version>4.12</junit.version>
<nacos.version>0.2.2.RELEASE</nacos.version>
<zipkin.version>2.10.1</zipkin.version>
<dubbo.version>2.7.4.1</dubbo.version>
</properties>
<dependencyManagement>
<dependencies>
<!-- Spring Cloud -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>0.9.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Dubbo -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-registry-nacos</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>${dubbo.version}</version>
</dependency>
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-serialization-kryo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!-- Spring Context Support -->
<dependency>
<groupId>com.alibaba.spring</groupId>
<artifactId>spring-context-support</artifactId>
<version>1.0.5</version>
</dependency>
<!-- JUnit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<!-- Nacos -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>${nacos.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- MySQL and JPA -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.17</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- zipkin -->
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin</artifactId>
<version>${zipkin.version}</version>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-server</artifactId>
<version>${zipkin.version}</version>
</dependency>
<dependency>
<groupId>io.zipkin.java</groupId>
<artifactId>zipkin-autoconfigure-ui</artifactId>
<version>${zipkin.version}</version>
</dependency>
</dependencies>
</dependencyManagement>
</project>
然而在后面的開發(fā)中經常會遇到不知道少了哪個依賴而啟動不起來的狀況刁品。雳攘。鸟辅。這個會在后續(xù)文章中慢慢總結。
公共API模塊
因為使用Dubbo
作為RPC框架,所以必須要有一個公共的API模塊脖捻。此外,這個模塊還可以用來存放一些公共資源退唠,比如實體類等≡崃牵現在就來建立這個模塊。
在wendev-parent
下新建一個Maven module拌汇,名為wendev-api
柒桑。
創(chuàng)建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>
<parent>
<groupId>site.wendev.microservice</groupId>
<artifactId>wendev-microservice</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>wendev-api</artifactId>
<dependencies>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
<scope>provided</scope>
</dependency>
</dependencies>
</project>
在這個module中單獨引入lombok
主要是為了方便以后創(chuàng)建實體類時使用。
因為目前我們什么服務都沒有噪舀,所以這個公共API模塊暫時還是空的魁淳。在后續(xù)開發(fā)中向這個模塊中添加了一些API后,需要執(zhí)行mvn install
將它安裝与倡,以便其他模塊進行引用(否則啟動的時候可能會報找不到包的錯誤界逛,但也有可能不報,所以最好還是mvn install
一下)纺座。