1.网关是什么
么?
找了一个图,从上图可以看出:我们发出的请求是先到了网关中,由网关进行分发到各个微服务中。网关就像一个门,一群羊(即请求)要进属于自己的羊圈(即微服务),首先通过网关来决定要去哪个羊圈(微服务)。
2.网关的作用?
由上图可知,当存在服务网关,前端程序通过服务网关调用后台服务,同时我们也可以在网关层进行各种操作,比如限流、权限校验等。此外,网关还有负载均衡的功能。
3.网关的编写
对于网关的选择,我们使用的是zuul网关组件。
3.1.新建my-zuul新module
参考新建注册中心过程,新module命名为my-zuul。
3.2.父项目pom文件的修改
在父项目的pom文件中引入zuul的依赖
org.springframework.cloudspring-cloud-starter-netflix-zuul2.1.3.RELEASE
3.3.修改my-zuul的pom文件
在my-zuul的pom文件中引入两个配置依赖
org.springframework.cloud spring-cloud-starter-netflix-eureka-client org.springframework.cloud spring-cloud-starter-netflix-zuul
3.4.新建配置文件
在src/main/resources文件夹中新建application.yml文件,编写配置信息,先编写基本的配置信息,待往后慢慢丰富。
spring: application: name: my-zuulserver: port: 8803eureka: client: service-url: defaultZone: http://localhost:8801/eureka/zuul: prefix: /api routes: my-user: /user/**
可以看出,zuul的配置信息和普通的微服务user大体上是一样的,都有微服务名字,端口号,注册中心相关信息。但是增加了zuul自己的配置。
prefix是指以后前端访问后端接口的url上要加上api的前缀,routes下面显示了路由转发的信息,举例来说:假如my-user微服务有个接口(/hello),我们想通过网关来访问这个接口,那么前端访问的url将会是 http://localhost:8803/api/user/hello 。网关检测到 /api的前缀,将会根据/use来查找相应的微服务,从而访问真正的接口(/hello)。
3.5.编写启动文件
在src/main/jave目录下新建con.zuul包,在这个包中新建ZuulApplication.class文件。
package com.zuul;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.cloud.client.discovery.EnableDiscoveryClient;import org.springframework.cloud.netflix.zuul.EnableZuulProxy;@SpringBootApplication@EnableDiscoveryClient@EnableZuulProxypublic class ZuulApplication { public static void main(String[] args) { SpringApplication.run(ZuulApplication.class); }}
对比my-user的启动文件,我们发现zuul的启动文件多了@EnableZuulProxy的注解,来声明这是一个网关。
4.验证
我们通过测试网关转发来访问接口。
4.1.新建controller文件
在my-user的java/com.uesr中新建controller文件夹,在controller文件夹中新建UserController类。my-user目录结构为
4.2.修改UserController代码
package com.user.controller;import com.alibaba.fastjson.JSONObject;import org.springframework.web.bind.annotation.*;@RestController@CrossOrigin //支持跨域public class UserController { @RequestMapping(value = "/hello", method = RequestMethod.GET) public String hello(){ System.out.println("hell0"); return "hello world"; }}
4.3. 验证
重启my-user微服务,在浏览器中访问:http://localhost:8802/hello
咦,好熟悉的“hello world".
接下来,我们访问:http://localhost:8803/api/user/hello
哇,也能访问到哎。这时候在去看看前面的解析,是不是有种恍然大明白的感觉。8803是zuul的接口,我们并没有直接访问my-user这个微服务,而是zuul通过/api前缀,和/user自动寻找到my-user微服务,并且去微服务中找/hello这个接口。
虽然看起来有些麻烦,但这其中的好处在以后的开发过程中会越来越明显的。
5.总结
网关有很多很多作用,我们这里只是演示了一个接口转发的例子,路由还可以进行负载均衡,身份验证,在未来的开发中会一步一步接触到的。