Skip to content

Commit 1acca22

Browse files
committed
Add lesson 11
1 parent 12fcc01 commit 1acca22

File tree

37 files changed

+1427
-1
lines changed

37 files changed

+1427
-1
lines changed

spring-cloud/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ Spring Cloud 系列课程致力于以实战的方式覆盖 Spring Cloud 的功
153153
* 本章小结(10分钟)
154154
* 问答互动(10分钟)
155155

156-
### 第十一节 Spring Cloud 服务网关
156+
### [第十一节 Spring Cloud 服务网关](https://segmentfault.com/l/1500000011386451/play)[课件](https://github.com/mercyblitz/segmentfault-lessons/tree/master/spring-cloud/lesson-11)[[问答](https://segmentfault.com/l/1500000011386451/d/1560000012313789)]
157157

158158
* 受众群体:具备一定的`Java`服务端编程经验更佳
159159

spring-cloud/lesson-11/README.md

Lines changed: 344 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,344 @@
1+
# [Spring Cloud 服务网关](https://segmentfault.com/l/1500000011386451)
2+
3+
4+
5+
6+
7+
## Spring Cloud Zuul
8+
9+
10+
11+
### 增加依赖
12+
13+
```xml
14+
<!-- 依赖 Spring Cloud Netflix Zuul -->
15+
<dependency>
16+
<groupId>org.springframework.cloud</groupId>
17+
<artifactId>spring-cloud-starter-zuul</artifactId>
18+
</dependency>
19+
```
20+
21+
22+
23+
### 创建 Zuul 代理应用
24+
25+
26+
27+
```java
28+
package com.segumentfault.spring.cloud.lesson11.zuul.proxy;
29+
30+
import org.springframework.boot.SpringApplication;
31+
import org.springframework.cloud.client.SpringCloudApplication;
32+
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;
33+
34+
/**
35+
* Zuul 代理引导类
36+
*
37+
* @author <a href="mailto:mercyblitz@gmail.com">Mercy</a>
38+
* @since 1.0.0
39+
*/
40+
@EnableZuulProxy
41+
@SpringCloudApplication
42+
public class ZuulProxyApplication {
43+
44+
public static void main(String[] args) {
45+
SpringApplication.run(ZuulProxyApplication.class, args);
46+
}
47+
48+
}
49+
```
50+
51+
52+
53+
### 配置 Zuul 应用
54+
55+
56+
57+
`application.properties`
58+
59+
```properties
60+
## Zuul 代理应用
61+
spring.application.name = zuul-proxy
62+
63+
## 服务端口
64+
server.port = 6060
65+
66+
## 管理安全失效
67+
management.security.enabled = false
68+
```
69+
70+
71+
72+
### 配置 zuul 路由规则
73+
74+
`application.properties`
75+
76+
```properties
77+
## 指定 user-service-provider
78+
zuul.routes.user-service-provider = /user-service/**
79+
80+
## 配置 ribbon
81+
user-service-provider.ribbon.listOfServers = http://localhost:9090/
82+
83+
## http://localhost:8080/user-service/* => http://localhost:9090/*
84+
```
85+
86+
87+
88+
89+
90+
### 配合 HTTP 客户端
91+
92+
> 注意:实际配置 Ribbon 底层 HTTP 调用客户端,并非 zuul 独享此功能
93+
94+
95+
96+
#### 默认客户端:HttpClient
97+
98+
99+
100+
装配类:`HttpClientRibbonConfiguration`
101+
102+
103+
104+
#### 配置客户端:OkHttpClient
105+
106+
107+
108+
装配类:`OkHttpRibbonConfiguration`
109+
110+
激活配置:`ribbon.okhttp.enabled=true`
111+
112+
113+
114+
## Spring Cloud 整合
115+
116+
### 服务端口信息
117+
118+
> 端口信息
119+
>
120+
> ​ zuul-proxy : 6060
121+
>
122+
> ​ config-server : 7070
123+
>
124+
> ​ user-service-client: 8080
125+
>
126+
> ​ user-service-provider : 9090
127+
>
128+
> ​ eureka-server : 10000
129+
130+
131+
132+
### 服务依赖关系
133+
134+
135+
136+
* eureka-server
137+
138+
* user-service-provider (1)
139+
140+
* config-server (2)
141+
142+
* user-service-client
143+
* zuul-proxy
144+
145+
146+
147+
### config-server 配置 zuul-proxy 信息
148+
149+
150+
151+
`configs/zuul-config.properties`
152+
153+
```properties
154+
## Zuul Proxy 配置内容
155+
156+
## 指定 user-service-provider
157+
zuul.routes.user-service-provider = /user-service/**
158+
## 指定 user-service-client
159+
zuul.routes.user-service-client = /user-client/**
160+
```
161+
162+
163+
164+
### zuul-proxy 作为配置客户端
165+
166+
167+
168+
#### 增加 config client 依赖
169+
170+
```xml
171+
<!-- 依赖 Spring Cloud Config Client -->
172+
<dependency>
173+
<groupId>org.springframework.cloud</groupId>
174+
<artifactId>spring-cloud-starter-config</artifactId>
175+
</dependency>
176+
```
177+
178+
179+
180+
#### 配置 config client 信息
181+
182+
183+
184+
`bootstrap.properties`
185+
186+
```properties
187+
## Zuul 代理应用
188+
spring.application.name = zuul-proxy
189+
190+
## 配置客户端应用关联的应用
191+
## spring.cloud.config.name 是可选的
192+
## 如果没有配置,采用 ${spring.application.name}
193+
spring.cloud.config.name = zuul-config
194+
## 关联 profile
195+
spring.cloud.config.profile = default
196+
## 关联 label
197+
spring.cloud.config.label = master
198+
## 激活 Config Server 服务发现
199+
spring.cloud.config.discovery.enabled = true
200+
## Config Server 服务器应用名称
201+
spring.cloud.config.discovery.serviceId = config-server
202+
## Spring Cloud Eureka 客户端 注册到 Eureka 服务器
203+
eureka.client.serviceUrl.defaultZone = http://localhost:10000/eureka
204+
```
205+
206+
207+
208+
### zuul-proxy 激活服务发现
209+
210+
211+
212+
#### 增加 Eureka Client 依赖
213+
214+
```xml
215+
<!-- 依赖 Spring Cloud Netflix Eureka -->
216+
<dependency>
217+
<groupId>org.springframework.cloud</groupId>
218+
<artifactId>spring-cloud-starter-eureka</artifactId>
219+
</dependency>
220+
```
221+
222+
223+
224+
225+
226+
ZuulFilter 调用链
227+
228+
229+
230+
`ZuulFilter#run()` <- `ZuulFilter#runFilter()` <- `FilterProcessor#runFilters`
231+
232+
233+
234+
`FilterProcessor#preRoute()`
235+
236+
`FilterProcessor#route()`
237+
238+
`FilterProcessor#postRoute()`
239+
240+
`ZuulServletFilter` `ZuulServlet`
241+
242+
```java
243+
RequestContext context = RequestContext.getCurrentContext();
244+
context.setZuulEngineRan();
245+
246+
try {
247+
preRoute();
248+
} catch (ZuulException e) {
249+
error(e);
250+
postRoute();
251+
return;
252+
}
253+
try {
254+
route();
255+
} catch (ZuulException e) {
256+
error(e);
257+
postRoute();
258+
return;
259+
}
260+
try {
261+
postRoute();
262+
} catch (ZuulException e) {
263+
error(e);
264+
return;
265+
}
266+
```
267+
268+
269+
270+
## Zuul 自动装配
271+
272+
273+
274+
`ZuulServletFilter` 适用范围更大,可以拦截所有的`Servlet`,包括 `ZuulServlet`
275+
276+
277+
278+
`ZuulServlet` 会有URL 匹配的模式,url-pattern
279+
280+
281+
282+
Zuul 有两种的激活模式:
283+
284+
* `@EnableZuulProxy`
285+
286+
导入`ZuulProxyMarkerConfiguration`,随后生成一个`ZuulProxyMarkerConfiguration.Marker()` Bean,这个Bean 作为`ZuulProxyAutoConfiguration` 的装配前置条件。
287+
288+
请注意:`ZuulProxyMarkerConfiguration` 扩展了 `ZuulServerAutoConfiguration`,所以 `ZuulServlet``ZuulController`会被自动装配
289+
290+
`ZuulController``DispatcherServlet` 来在控制,它的映射地址是:"/*",
291+
292+
`DispatcherServlet` 中注册了一个`ZuulHandlerMapping` ,它控制映射到`ZuulController`,可以参考`ZuulServerAutoConfiguration`:
293+
294+
```java
295+
@Bean
296+
public ZuulController zuulController() {
297+
return new ZuulController();
298+
}
299+
300+
@Bean
301+
public ZuulHandlerMapping zuulHandlerMapping(RouteLocator routes) {
302+
ZuulHandlerMapping mapping = new ZuulHandlerMapping(routes, zuulController());
303+
mapping.setErrorController(this.errorController);
304+
return mapping;
305+
}
306+
```
307+
308+
通过源码分析,`ZuulController` 将请求委派给`ZuulServlet`,所以所有的`ZuulFilter` 实例都会被执行。
309+
310+
> 因此,访问 http://localhost:6060/user-service-client/user/find/all ,实际将请求递交给 DispatcherServlet
311+
>
312+
> 发送请求"/user-service-client/user/find/all"
313+
314+
* `DispatcherServlet`
315+
* `ZuulHandlerMapping`
316+
* `ZuulController`
317+
* `ZuulServlet`
318+
* `RibbonRoutingFilter`
319+
320+
321+
* `@EnableZuulServer`
322+
323+
导入`ZuulServerMarkerConfiguration` ,随后生成一个 `ZuulServerMarkerConfiguration.Marker()` Bean ,主要用作引导装配`ZuulServerAutoConfiguration`
324+
325+
326+
327+
`ZuulServerAutoConfiguration`与 父类 `ZuulProxyMarkerConfiguration` 区别:
328+
329+
父类`ZuulProxyMarkerConfiguration` 提供了`RibbonRoutingFilter`
330+
331+
332+
333+
调用层次:
334+
335+
* `DispatcherServlet`
336+
* `ZuulHandlerMapping`
337+
* `ZuulController`
338+
* `ZuulServlet`
339+
* `ZuulFilter`
340+
341+
342+
343+
344+
Binary file not shown.
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
target/
2+
!.mvn/wrapper/maven-wrapper.jar
3+
4+
### STS ###
5+
.apt_generated
6+
.classpath
7+
.factorypath
8+
.project
9+
.settings
10+
.springBeans
11+
12+
### IntelliJ IDEA ###
13+
.idea
14+
*.iws
15+
*.iml
16+
*.ipr
17+
18+
### NetBeans ###
19+
nbproject/private/
20+
build/
21+
nbbuild/
22+
dist/
23+
nbdist/
24+
.nb-gradle/

0 commit comments

Comments
 (0)