微服务架构学习-进阶篇--06,服务网关(上)

第一节,为什么要用网关?它解决了什么问题?

在这里插入图片描述

第二节,编写网关的入门例子

(1)在e-book模块下新建子模块zuul,在pom文件中加入eureka的依赖:

<dependency>
		<groupId>org.springframework.cloud</groupId>
		<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>

(2)在zuul模块下新建maven项目,命名为zuul-gateway。
(3)修改pom文件,加入如下依赖:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>
		
<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>

(4)添加一个配置文件application.properties,加入如下配置:

spring.application.name=zuul-gateway
server.port=8114

eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8762/eureka/

(5)添加一个启动类。

package com.twf.zuul.gateway;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy
public class ZuulApplication {

	public static void main(String[] args) {
		SpringApplication.run(ZuulApplication.class, args);
	}
}

(6)启动该项目,并且启动ProductCoreApplication。
(7)先用浏览器访问http://localhost:8088/product/list,结果如下:
在这里插入图片描述
(8)然后通过网关访问这个接口,浏览器访问http://localhost:8114/e-book-product/product/list,结果和上面的一样。
(这个例子是由网关的IP端口加微服务的应用名及具体接口路径组成)

第三节,路由器的4种规则方法

(1)在zuul模块下新建maven项目,命名为zuul-gateway-route,拷贝zuul-gateway的文件和代码到该项目。
(2)修改配置文件。这里总共介绍了7种方式,每试一种就解开这一种的注释,然后注释其他的配置。

spring.application.name=zuul-gateway-route
server.port=8115

eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8762/eureka/


#默认是hostname 注册,改成IP 注册
eureka.instance.perferIpAddress=true


## 1 ###################### 路由指定:URL指定  #############################
## URL匹配关键字,如果包含关键字就跳转到指定的URL中 
#zuul.routes.book-product.path=/book-product/**
#zuul.routes.book-product.url=http://127.0.0.1:8088/


## 2 ###################### 路由指定:服务指定1  #############################
##将路径的/book-product/引到 eureka的e-book-product服务上
##规则:zuul.routes.路径名.path
##规则:zuul.routes.路径名.serviceId=eureka的服务名
##http://127.0.0.1:9010/book-product/product/list
##等同于
##http://127.0.0.1:9010/e-book-product/product/list
#zuul.routes.book-product.path=/book-product/**
#zuul.routes.book-product.serviceId=e-book-product


## 3 ###################### 路由指定:服务指定1   #############################
#zuul.routes后面跟着的是服务名,服务名后面跟着的是路径规则,这种配置方式更简单。
#zuul.routes.e-book-product.path=/book-product/**

## 4 ###################### 路由排除:排除某几个服务  #############################
##排除后,这个地址将为空 http://127.0.0.1:9010/e-book-product/product/list 
## 多个服务逗号隔开
#zuul.ignored-services=e-book-product

## 5 ###################### 路由排除:排除所有服务  #############################
#由于服务太多,不可能手工一个个加,故路由排除所有服务,然后针对要路由的服务进行手工加
#zuul.ignored-services=*
#zuul.routes.e-book-consumer-hystrix.path=/book-consumer/**

## 6 ###################### 路由排除:排除指定关键字的路径  #############################
# 排除所有包括/list/的路径
#zuul.ignored-patterns=/**/list/**
#zuul.routes.e-book-product.path=/book-product/**

## 7 ###################### 路由添加前缀:为所有路径添加前缀  #############################
##http://127.0.0.1:9010/book-product/product/list
##必须改成
##http://127.0.0.1:9010/api/book-product/product/list
#zuul.prefix=/api
#zuul.routes.e-book-product.path=/book-product/**

在这里插入图片描述

第四节,如何定义自己的过滤器

(1)在zuul模块下新建maven项目,命名为zuul-gateway-filter。
(2)修改配置文件,添加如下依赖:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>

(3)修改配置文件,添加如下配置:

spring.application.name=zuul-gateway-filter
server.port=8117

eureka.client.serviceUrl.defaultZone=http://user:123456@eureka1:8761/eureka/,http://user:123456@eureka2:8762/eureka/

(4)添加一个过滤类。

package com.twf.zuul.gateway.filter.filter;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;

@Component
public class LogFilter extends ZuulFilter{

	private static final Logger logger = LoggerFactory.getLogger(LogFilter.class);
	
	/**
	 * 是否开启过滤器,默认为false,不开启。我们现在开启它,就设为true。
	 */
	@Override
	public boolean shouldFilter() {
		return true;
	}

	/**
	 * 过滤器的作用,打印请求的信息
	 */
	@Override
	public Object run() {
		RequestContext rc=RequestContext.getCurrentContext();
		HttpServletRequest request=rc.getRequest();
		logger.info("method={},url={}",request.getMethod(),request.getRequestURL().toString());
		return null;
	}

	@Override
	public String filterType() {
		return "pre";
	}

	@Override
	public int filterOrder() {
		return 0;
	}
}

(5)添加一个启动类。

package com.twf.zuul.gateway.filter;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy;

@SpringBootApplication
@EnableZuulProxy
public class ZuulFilterApplication {

	public static void main(String[] args) {
		SpringApplication.run(ZuulFilterApplication.class, args);
	}
}

(6)启动该项目,然后启动ProductCoreApplication。
(7)浏览器访问http://localhost:8117/e-book-product/product/findAllProduct,后台过滤日志打印如下:
在这里插入图片描述

第五节,过滤器有哪些类型?它有何用?

在这里插入图片描述
在这里插入图片描述
源码点这里

猜你喜欢

转载自blog.csdn.net/tanwenfang/article/details/87937230