文章目录
一、引入微服务
1、微服务的特点 - 化整为零
-
小型化 - 只做好一件事
-
自治理 - 高内聚/低耦合
-
扁平化 - 不要随意混搭
-
轻量级设计 - Http-Restful API
-
渐进式设计 - 业务驱动模式,循序渐进迭代
话不多说,基础知识 网上一大堆,接下来入门微服务,手动搭建及排坑。
二、从Eureka开始循序渐进
1、要先把eureka玩明白了,首先介绍下我的基本环境
//作为参考
idea
jdk 1.8
springboot 2.5.3
springcloud 2020.0.3
maven 3.5
2、简单介绍Eureka(注册中心)
简单两句话:注册中心是分布式架构中最重要的部分,用于服务的注册与发现。所有的微服务必须在注册中心中登记才能被使用。
- 新建服务端项目,选择 Spring Initializr
- 下一步,起项目包名,java环境
- 【重要】
至此项目建立成功。
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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.springcloud</groupId>
<artifactId>registry</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>registry</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
- 修改配置文件application.properties
# 应用名称&&注册中心的id
spring.application.name=registry
# 建议与eureka监听端口一致
server.port=8761
#registry即是客户端也是服务端,在这里将客户端注释掉
eureka.client.register-with-eureka=false
eureka.client.service-url.defaultZone=http://localhost:8761/eureka
- 修改启动类,添加@EnableEurekaServer //启动注册中心
访问localhost;8761,如果不添加配置中对客户端的注释,就会出现以下的REGISTRY客户端
3、Eureka Client注册微服务
[ 1 ] 新建客户端项目,选择 Spring Initializr
[ 2 ] 选择web,需要注册服务
[ 3 ] eureka客户端
[ 4 ] 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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.springcloud</groupId>
<artifactId>client</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>client</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2020.0.3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
[ 5 ] 修改启动类,加注解开开关
@EnableEurekaClient //开启客户端,在启动类添加
[ 6 ] 新建客户端controller
@Controller
public class clientController {
@Value("${server.port}")
private String port;
@GetMapping("/msg")
@ResponseBody //返回数据json化
public String msg(){
return "hello IT散记"+port;
}
}
[ 7 ] 配置文件 application.properties
spring.application.name=client
# 客户端的负载均衡格式
eureka.client.service-url.defaultZone=http://localhost:8761/eureka/,http://localhost:8762/eureka/
本项目结构如下:
执行后访问localhost:8761 可以看到注册的客户端,名字同配置文件中的name
每30s会发送心跳包,检查注册信息,实时更新client。
有小伙伴注意到上述的配置中的负载均衡 ,考虑一下 实际使用中有多个服务,也就是客户端 都注册到rureka注册中心的情况,还有为了保证高可用,设计多个server端进行配置。接下来带你研究:
4、Eureka 多Client && 多server
(1) 增加服务端
Erueka即是客户端 也是客户端,添加两个注册端副本 见下图
非常简单的哈 ,增加端口8762的服务。
#注意:启动8762的服务时候注册中心地址设置8761端口,相似,启动8761的服务时候注册中心地址设置8762端口
eureka.client.service-url.defaultZone=http://localhost:端口/eureka
访问localhost:8761\8762 ,两个地址均可看到已注册的客户端。
在客户端中可以定义多个Eureka注册中心,Eyreka client运行时会按前后顺序自动选择;
这种在客户端选择注册中心的机制,我愿称之为客户端负载均衡。
(2) 增加客户端
添加两个client不同端口:-Dserver.port=8000,8001
访问localhost:8761
访问localhost:8000(8001)/msg
---------可是做到这发现没啥用啊,还是得访问业务的ip加对应端口进行访问,微服务操作了个寂寞。
莫慌,接下来引入网关 来解决这个问题
三、网关组件zuul
丑图镇楼
1、新建Gateway项目
- —直接跳到选择依赖这一步,(记得选上web依赖,因为需要注册服务嘛)。如果你是springboot2.3以后的 比如我的2.5 打开是这个样子
天哪,默认都是gateway了 ,技术一直在前进,无奈我看的教程还是讲zuul的。为了能把项目跑下来,先研究zuul网关,上网查阅后,我选择用springboot 2.0.1.RELEASE 以及springcloud Finchley.RELEASE跑起来了,适合自己的电脑能跑起来才是最好的。
SpringBoot与SpringCloud需要版本对应,否则可能会造成很多意料之外的错误,比如eureka注册了结果找不到服务类啊,比如某些jar导入不进来啊,等等这些错误。找了一份比较老旧的参考一下,自行官网查阅即可。
Spring Boot | Spring Cloud |
---|---|
1.5.2.RELEASE | Dalston.RC1 |
1.5.9.RELEASE | Edgware.RELEASE |
2.0.2.RELEASE | Finchley.BUILD-SNAPSHOT |
2.0.3.RELEASE | Finchley.RELEASE |
2.1.0.RELEASE-2.1.14.RELEASE | Greenwich.SR5 |
2.2.0.M4 | Hoxton.SR4 |
我的网关项目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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.1.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example.springcloud</groupId>
<artifactId>gateway</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>gateway</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--服务网关-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</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>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
如果你的项目起来并不报错了,来进行下一步
-
在GatewayApplication中 增加注解
@EnableEurekaClient @EnableZuulProxy //启动路由服务
-
配置文件application.yml (和properties一样用)
spring:
application:
name: gateway
eureka:
client:
service-url:
defaultZone: http://localhost:8761/eureka/
server:
port: 9000
运行项目,观察注册中心
已经注册上了,从此后所有的服务都会走9000端口进行访问,zuul访问规则:
http://xxxx:xx/service-id/... //service-id 就是注册的客户端名字
因为新建客户端时候已经启动了 8000以及8001两个端口,在controller中我们编写了返回相应端口,也就是为了验证这一步的服务转发,即多次访问上图中我的地址,会去访问8000及8001两个端口的服务。可以自行尝试。
同理增加8003…等端口的服务只需要添加配置,就会自动注册到架构中来,可见微服务下水平业务的扩展,增加一个新应用多容易,只需要登记一下就好了。
此时如果感觉地址中暴露的client字段还不够友好,那么可以添加配置文件
zuul:
routes:
client: /c/** #c就是你想替换的名字,**代表所有
2、入门一阶段结语
开发中定义不同的客户端名字进行开发,最后使用zuul进行统一路由就好了。zuul的功能还很强大,(请求拦截、跨域访问、、)咱们遇到再说
至此是不是有一点点了解了呢,建议理论知识自行查阅补充,我这里跟着使用来走一遍,接下来就是 拿一个小项目,从最初的数据库设计,架构模块的微服务模式划分开始走起,实际应用到springcloud。
未完待续…