SpringCloud微服务网关技术

SpringCloud微服务网关技术

网关:Api(接口) gateway(网关)----接口网关注意:接口没有界面

网关概念:相当于客户端请求统一先请求到网关服务器上,再由网关服务器进行转发到实际服务器地址上类似于Nginx

  1. 微服务网关技术产生的背景
  2. 微服务网关平台 设计思想
    1. 内网网关:管理内部微服务的网关平台
    2. 外网网关:管理外部和内部请求的网关
  3. 微服务网关的作用
    1. 拦截客户端所有请求,对请求进行权限控制,负载均衡,日志管理,接口调用监控等。
  4. 网关与过滤器区别
    1. 过滤器适合单个tomcat服务器进行拦截请求
    2. 网关是拦截整个微服务所有请求。
  5. zuul和Nginx的区别
    1. 相同点:都能实现反向代理,负载均衡,过滤请求,实现网关效果。
    2. 不同点:
      1. Nginx采用C语言 zuul用java语言写的。
      2. zuul负载均衡是采用ribbon+Eureka实现负载均衡
      3. Nginx是采用服务器端实现负载均衡。
      4. Nginx比Zuul功能强大,因为Nginx整合一些脚本语言(Nginx+Lua)
      5. Nginx适合于服务器端负载均衡。
      6. Zuul适合微服务中实现网关,而且使用技术是java语言。
    3. 最好建议是Nginx+Zuul实现网关
      1. Nginx作用实现反向代理
      2. Zuul对微服务实现网关拦截(黑名单白名单等)
  6. 搭建SpringCloudZuul网关平台
    1. 现在搭建一个网关需求就是当客户以app-member/** 请求会转到app-qxd-member这个服务等。
    2. 网管服务和会员订单服务都是在一个局域网中的。
    3. 现在第一步导入依赖信息代码如下:
      <parent>
      		<groupId>org.springframework.boot</groupId>
      		<artifactId>spring-boot-starter-parent</artifactId>
      		<version>2.0.1.RELEASE</version>
      	</parent>
      	<!-- 管理依赖 -->
      	<dependencyManagement>
      		<dependencies>
      			<dependency>
      				<groupId>org.springframework.cloud</groupId>
      				<artifactId>spring-cloud-dependencies</artifactId>
      				<version>Finchley.M7</version>
      				<type>pom</type>
      				<scope>import</scope>
      			</dependency>
      		</dependencies>
      	</dependencyManagement>
      	<dependencies>
      		<dependency>
      			<groupId>org.springframework.cloud</groupId>
      			<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
      		</dependency>
      		<!-- SpringBoot整合eureka客户端 -->
      		<dependency>
      			<groupId>org.springframework.cloud</groupId>
      			<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
      		</dependency>
      	</dependencies>
      	<!-- 注意: 这里必须要添加, 否者各种依赖有问题 -->
<repositories>
	<repository>
		<id>spring-milestones</id>
		<name>Spring Milestones</name>
		<url>https://repo.spring.io/libs-milestone</url>
		<snapshots>
			<enabled>false</enabled>
		</snapshots>
	</repository>
</repositories>
  上面如果有导入不进去的可以将maven仓库全部删除重新下载,这样就不会有版本冲突等。
  1. 导入yml文件信息代码如下:
   ###注册 中心
      eureka:
        client:
          serviceUrl:
            defaultZone: http://localhost:8100/eureka/
      server:
        port: 80
      ###网关名称
      spring:
        application:
          name: service-zuul
      ### 配置网关反向代理    
      zuul:
        routes:
          api-a:
           ### 以 /api-member/访问转发到会员服务
            path: /api-member/**
            serviceId: app-qxd-member
          api-b:
              ### 以 /api-order/访问转发到订单服务
            path: /api-order/**
            serviceId: app-qxd-order
  app-qxd-member是Eureka注册中心上的服务id名称调用。并且zuul整合了ribbon的负载均衡,可以实现访问集群。
  接下来接可以创建启动类了,在上面加上@EnableZuulProxy
  1. Zuul网关拦截参数信息
    1. 代码如下:
  @Component
  public class TokenFilter extends ZuulFilter {
  	public Object run() throws ZuulException {
  		// 获取上下文
  		RequestContext currentContext = RequestContext.getCurrentContext();
  		HttpServletRequest request = currentContext.getRequest();
  		String userToken = request.getParameter("userToken");
  		if (StringUtils.isEmpty(userToken)) {
  			currentContext.setSendZuulResponse(false);
  			currentContext.setResponseStatusCode(401);
  			currentContext.setResponseBody("userToken is null");
  			return null;
  		}
  		// 否则正常执行业务逻辑.....
  		return null;
  	}
  	// 判断过滤器是否生效
  	public boolean shouldFilter() {
  		return true;
  	}
  	// 过滤器的执行顺序。当请求在一个阶段的时候存在多个多个过滤器时,需要根据该方法的返回值依次执行
  	public int filterOrder() {
  		return 0;
  	}
  	// 过滤器类型 pre 表示在 请求之前进行拦截
  	public String filterType() {
  		return "pre";
  	}
  }
  1. 搭建动态Zuul网关路由转发(SpringCloud Config 分布式配置中心)
    就是在我之前发的SpringCloud Config之上把yum文件中需要动态改变的地方放到git服务器上面,启动ConfigServer就可以了。
    比如像登录的时候,很多微服务都调用权限校验会产生冗余的代码,所以可以直接放在网关过滤器。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【课程介绍】     课程目标:             - 有状态登录和无状态登录的区别             - 常见的非对称加密算法和非对称的加密方式             - 老版本只使用jwt进行加密的弊端             - 授权中心的授权流程             - 如何整合网关组件实现jwt安全验证             - 理解什么是公钥什么是私钥      - 深刻理解授权流程什么是有状态? 有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。例如登录:用户登录后,我们把登录者的信息保存在服务端session中,并且给用户一个cookie值,记录对应的session。然后下次请求,用户携带cookie值来,我们就能识别到对应session,从而找到用户的信息。缺点是什么?- 服务端保存大量数据,增加服务端压力- 服务端保存用户状态,无法进行水平扩展- 客户端请求依赖服务端,多次请求必须访问同一台服务器。什么是无状态? 微服务集群中的每个服务,对外提供的都是Rest风格的接口。而Rest风格的一个最重要的规范就是:服务的无状态性,即:- 服务端不保存任何客户端请求者信息- 客户端的每次请求必须具备自描述信息,通过这些信息识别客户端身份带来的好处是什么呢?- 客户端请求不依赖服务端的信息,任何多次请求不需要必须访问到同一台服务- 服务端的集群和状态对客户端透明- 服务端可以任意的迁移和伸缩- 减小服务端存储压力
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值