A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

为什么要使用微服务网关
简单来说,微服务网关是微服务架构中一个不可或缺的部分。通过服务网关统一向外系统提供REST API的过程中,除了具备服务路由、均衡负载功能之外,它还具备了权限控制等功能。

API网关是什么
API网关可以提供一个单独且统一的API入口用于访问内部一个或多个API。简单来说嘛就是一个统一入口,比如现在的支付宝或者微信的相关api服务一样,都有一个统一的api地址,统一的请求参数,统一的鉴权。
客户端和服务端直连的弊端
•        客户端会对此请求不同的微服务,增加客户端复杂性
•        存在跨域请求时,需要进行额外处理
•        认证服务,每个服务需要独立认证
•        UI端和微服务耦合
网关的优缺点
优点:
•        减少api请求次数
•        限流
•        缓存
•        统一认证
•        降低微服务的复杂度
•        支持混合通信协议(前端只和api通信,其他的由网关调用)
•        ……
缺点:
•        网关需高可用,可能产生单点故障
•        管理复杂
Zuul实践
创建工程:spring-cloud-zuul。 这里直接加入了注册中心进行服务化模式。
0.加入pom依赖。
        <!-- zuul 依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
        </dependency>        
        <!-- eureka client 依赖 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>
注意:这里的Eureka不是必须的。在没有注册中心的情况下,也是可以进行zuul使用的。
1.配置文件,配置注册中心相关信息、路由规则等。
spring.application.name=zuul-server
server.port=8888

# 注册中心地址 -此为单机模式
eureka.client.service-url.defaultZone=http://127.0.0.1:1000/eureka
# 启用ip配置 这样在注册中心列表中看见的是以ip+端口呈现的
eureka.instance.prefer-ip-address=true
# 实例名称  最后呈现地址:ip:15678
eureka.instance.instance-id=${spring.cloud.client.ip-address}:${server.port}

## 路由规则
## 传统路由配置:不依赖服务发现。
## 所有以myapi开头的url路由至http://127.0.0.1:2000/下
## 如http://127.0.0.1:8888/myapi/hello --> http://127.0.0.1:2000/hello
zuul.routes.myApi.path=/myapi/**
zuul.routes.myApi.url=http://127.0.0.1:2000

#forward模式 直接转发至zuul提供的rest服务
zuul.routes.myDemo.path=/myDemo/**
zuul.routes.myDemo.url=forward:/demo

## 服务发现模式
# 路由地址
zuul.routes.myEureka.path=/eureka/**
#为具体服务的名称
zuul.routes.myEureka.service-id=eureka-client

友情提示: 默认情况下:Zuul代理所有注册到EurekaServer的微服务,路由规则: http://ZUUL_HOST:ZUUL_PORT/微服务实例名(serverId)/** 转发至serviceId对应的微服务。
如:http://127.0.0.1:8888/eureka-client/hello?name=oKong 最后就是转发至:http://127.0.0.1:2000//hello?name=oKong
2.启动类加入@EnableZuulProxy注解,声明一个Zuul代理。
/**
* zuul 示例
*
* @author oKong
*
*/
@SpringBootApplication
@EnableZuulProxy
@EnableDiscoveryClient
@Slf4j
public class SpringCloudZuulApplication {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(SpringCloudZuulApplication.class, args);
        log.info("spring-cloud-zuul启动!");
    }

}
3.编写一个控制类,测试forward功能。

/**
* zuul 内部提供对外服务示例
* @author oKong
*
*/
@RestController
@RequestMapping("/demo")
public class DemoController {

    @GetMapping("/hello")
    public String hello(String name) {
        return "hi," + name + ",this is zuul api! ";
    }
}
4.启动spring-cloud-eureka-server和spring-cloud-eureka-client服务,之后再启动spring-cloud-zuul服务。
此时,我们来访问zuul内部服务:http://127.0.0.1:8888/demo/hello?name=oKong

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马