该栏目讲叙微服务概念、注册中心、负载均衡、配置中心、服务熔断、服务消费等知识



简介

1、概述

  • API 网关就像一个安检站,所有外部的请求都需要经过它的调度与过滤,然后由 API 网关根据请求标识解析出具体的微服务地址,再把请求转发到该微服务

2、场景

  • 路由
  • 过滤
  • 监控
  • 安全认证
  • 限流

3、优点

  • 易于监控
  • 易于认证
  • 减少了客户端与各个微服务之间的交互次数

Nginx 实现 API网关

下载http://nginx.org/en/download.html
配置规则

# 打开nginx.conf

http {
	server {
		listen 80;
		server_name localhost;

		# 路由到商品服务
		localhost /api-order {   # 当客户端访问这个路径时转发到proxy_pass指定的路径
			proxy_pass http://localhost:7070/;
		}

		# 路由到订单服务
		localhost /api-product {   # 当客户端访问这个路径时转发到proxy_pass指定的路径
			proxy_pass http://localhost:9090/;
		}
	}
}

Zuul 实现 API网关

1、路由配置规则

  • 服务名称路由
zuul:
  routes:
    product-service: # 路由Id自定义
      path: /product-service/**  # 配置请求URL的映射路径
      serviceId: product-service # 根据serviceId自动从注册中心获取服务地址并转发
# 当路由Id和服务名称一致时,可以省略serviceId
  • 路由排除
zuul:
  ignored-services: order-service # 服务名称排除,多个服务名称用逗号分隔,'*'排除所有
  # 不受路由排除影响
  routes:
    product-service:
      path: /product-service/**
      serviceId: product-service
  • 服务名称路由
zuul:
  routes:
    product-service:
      path: /product-service/**
      serviceId: product-service
  prefix: /api # 路由前缀,例:http://localhost:8080/product-service/api/1

2、网关过滤器

  • 概述:对请求进行干预,是实现请求校验,服务聚合等功能的基础
  • 类型
描述类型
前置过滤pre
路由后过滤pre
后置过滤post
异常过滤error
  • 生命周期
    过滤器的生命周期

3、案例

  • 配置依赖
<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>
</dependencies>
  • 配置规则
server:
  port: 9000 # 端口

spring:
  application:
    name: zuul-server  # 应用名称
 
# 配置路由
zuul:
  ignored-services: order-service # 服务名称排除,多个服务名称用逗号分隔,'*'排除所有
  prefix: /api # 路由前缀,例:http://localhost:8080/product-service/api/1
  routes:
    product-service: # 路由Id自定义
      path: /product-service/**  # 配置请求URL的映射路径
    
# 配置注册中心
eureka:
  instance:
    prefer-ip-address: true  #启用IP地址注册
    instance-id: ${spring.cloud.client.ip-address}:${server.port}  #ip:port
  client:
    registry-fetch-interval-seconds: 10 # 表示客户端间隔多久向服务端摘取注册信息,默认30秒
    service-url:   # 设置服务注册中心
      default-zone: http://localhost:8761/eureka/,http://localhost:8762/eureka/
  • 编写过滤器
// 用户登录过滤器
public class LoginFilter extends ZuulFilter {

    // 四种类型:pre,routing,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 {
    
        RequestContext context = RequestContext.getCurrentContext();
        HttpServletRequest request = context.getRequest();
        String token = request.getParameter("token");
        if (token == null) {
            context.setSendZuulResponse(false);
            context.setResponseStatusCode(401);
            context.setResponseBody("unAuthrized");
        }
        return null;
    }
    
}
  • 启动网关
@SpringBootApplication
@EnableZuulProxy
public class ZuulServerApplication {

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

}
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐