1.問題答疑:
網關API(接口) Gateway(網關) ---接口網關注意: 接口沒有界面
1.網關概念:相當於客戶端請求統一先請求到網關服務器上,在由網關服務器進行轉發到實際服務地址上,類似Nginx
2.網關作用:網關可以攔截客戶端所有請求,對該請求進行權限控制,負載均衡,日誌管理,接口調用監控等
3.網關和過濾器區別是什麼?
網關是攔截整個微服務所有請求, 過濾器是攔截單個tomcat服務器請求
4.Nginx與Zuul區別?
相同點: Nginx和Zuul都可以實現負載均衡,反向代理,過濾請求,實現網關效果.
不同點: Nginx採用C語言編寫,Zuul採用java語言編寫. Zuul負載均衡實現:採用ribbon+eureka實現本地負載均衡
Nginx負載均衡實現:採用服務器端實現負載均衡.Nginx比Zuul功能會更加強大,因爲Nginx整合一些腳本語言 (Nginx+Lua) 可以實現一些其他功能.
Nginx適合於服務器負載均衡 + 也可以實現網關. Zuul適合微服務中實現網關,而且使用技術是java語言
Nginx作用實現反向代理,Zuul對微服務實現網關攔截. 標配最好Nginx+Zuul實現網關.
5.接口什麼背景下產生? 在面向服務架構和微服務背景下產生,目的都是爲了解耦,RPC遠程調用中產生
6.接口如何分類?
開放接口:其他機構合作伙伴進行調用(必須在外網訪問) 螞蟻開放平臺 ,微信公衆號開發
需要通過appid+appsocet生成accessToken進行通訊.對接支付開發,微信開發,目的可以
授權一些接口權限OAuth2.0協議方式 如:第三方聯合登錄
內部接口:一般只能在局域網中進行訪問,服務與服務調用之間關係都在同一個微服務系統中,目的是爲了
保證安全問題
設計一套公司項目的接口,你會如何設計?
接口權限(開放接口(遵循OAuth2.0協議)|內部接口),考慮冪等性,安全性(Https) 防止篡改數據(驗證簽名),
使用網關攔截接口實現黑名單和白名單 , 接口使用http協議+json格式restful風格目的爲了跨平臺.
考慮高併發 對接口服務實現保護.服務降級熔斷隔離等.最後使用API統一管理平臺 Swagger UI
2.搭建Zuul網關
1.添加pom.xml依賴
<!--SpringBoot整合WEB組件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--SpringBoot整合Eureka客戶端組件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--SpringCloud整合 zuul網關-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
2.添加配置文件application.properties
#指定運行端口
server.port=80
#服務名稱
spring.application.name=zuul-gateway
#配置註冊中心地址
eureka.client.service-url.defaultZone=http://localhost:8000/eureka/
#zuul網關配置 start
#當客戶端發送請求127.0.0.1:80/api-member開頭的,都會轉發到會員服務
zuul.routes.api-member.path=/api-member/**
#服務別名 zuul網關默認整合ribbon 自動實現負載均衡輪詢效果
zuul.routes.api-member.service-id=member
#當客戶端發送請求127.0.0.1:80/api-order開頭的,都會轉發到訂單服務
zuul.routes.api-b.path=/api-order/**
#服務別名
zuul.routes.api-b.service-id=order
#zuul網關配置 end
3.配置啓動類
@SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy //開啓zuul 網關
public class AppGateWay {
public static void main(String[] args) {
SpringApplication.run(AppGateWay.class,args);
}
}
4,訪問測試
5,添加Zuul過濾器
@Component
public class TokenFilter1 extends ZuulFilter {
//過濾類型
//pre:在請求被路由(轉發)之前調用
//route:在路由(請求)轉發時被調用
//error:服務網關發生異常時被調用
//post:在路由(轉發)請求後調用
@Override
public String filterType() {
return "pre";
}
//過濾器執行順序,當一個請求在同一個階段的時候存在多個過濾器的時候,多個過濾器執行順序
@Override
public int filterOrder() {
return 0;
}
//判斷過濾器是否生效
@Override
public boolean shouldFilter() {
return true;
}
//編寫過濾器攔截業務邏輯代碼
@Override
public Object run() throws ZuulException {
//案例:攔截所有的服務接口,判斷服務接口上是否有傳遞userToken參數
//1.獲取上下文
RequestContext currentContext = RequestContext.getCurrentContext();
// 2.獲取request對象
HttpServletRequest request = currentContext.getRequest();
// 3.獲取token的時候從請求頭中過去 ,此處測試,直接獲取url上值
//String userToken = request.getHeader("userToken");
String userToken = request.getParameter("userToken");
if(StringUtils.isEmpty(userToken)){
//不會繼續執行...不會去調用服務接口,網關服務直接響應給客戶端
currentContext.setSendZuulResponse(false);
//返回一個錯誤提示
currentContext.setResponseBody("userToken is null");
currentContext.setResponseStatusCode(401);
return null;
}
//正常執行調用其他服務接口.....
return null;
}
}