2019-12-15 Spring Cloud微服务从入门到入土
项目地址:https://gitee.com/QNKCDZ0/WenDev-Microservice
为什么要做微服务?
最初的目的其实很简单——好奇啊!整天听说微服务有多么多么厉害,在大型项目上的表现有多么多么好。本着“既然好奇那就一定要自己试一试”的心态,开搞了。
为什么使用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版?)。
创建一个父工程wendev-parent
,用于整个项目的依赖管理和模块管理。
创建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>
然而在后面的开发中经常会遇到不知道少了哪个依赖而启动不起来的状况。。。这个会在后续文章中慢慢总结。
公共API模块
因为使用Dubbo
作为RPC框架,所以必须要有一个公共的API模块。此外,这个模块还可以用来存放一些公共资源,比如实体类等。现在就来建立这个模块。
在wendev-parent
下新建一个Maven module,名为wendev-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>
<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
主要是为了方便以后创建实体类时使用。
因为目前我们什么服务都没有,所以这个公共API模块暂时还是空的。在后续开发中向这个模块中添加了一些API后,需要执行mvn install
将它安装,以便其他模块进行引用(否则启动的时候可能会报找不到包的错误,但也有可能不报,所以最好还是mvn install
一下)。