环境
  eclipse 4.7
  jdk 1.8
  Spring Boot 1.5.2
  Spring Cloud 1.2

一、接口网关
接口网关:拦截所有的请求,交由接口网关,然后接口网关进行转发,类似nginx反向代理。

二、Zuul
Zuul的主要功能是路由转发和过滤器。路由功能是微服务的一部分,比如/api/user转发到到user服务,/api/shop转发到到shop服务, 类似于nginx转发。
zuul默认和Ribbon结合实现了负载均衡的功能。

三、搭建zuul网关工程(eureka client)
1、新建maven工程:service-zuul


2、pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.wjy</groupId>
<artifactId>service-zuul</artifactId>
<version>0.0.1-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.2.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-zuul</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies> <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.RC1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> <repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories> </project>

3、application.yml

eureka:
client:
serviceUrl:
defaultZone: http://localhost:8888/eureka/
server:
port: 8769
spring:
application:
name: service-zuul
zuul:
routes:
api-a:
path: /api-member/**
service-id: service-member
api-b:
path: /api-order/**
service-id: service-order

4、路由转发
启动类需要加@EnableZuulProxy 开启路由转发功能

package com.wjy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.zuul.EnableZuulProxy; @SpringBootApplication
@EnableEurekaClient
@EnableZuulProxy
public class ZuulApp {
public static void main(String[] args) {
SpringApplication.run(ZuulApp.class, args);
} }

修改MemberController:

package com.wjy.controller;

import java.util.ArrayList;
import java.util.List; import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class MemberController { @Value("${server.port}")
private String serverPort; @RequestMapping("/getUserList")
public List<String> getUserList() {
List<String> listUser = new ArrayList<String>();
listUser.add("zhangsan");
listUser.add("lisi");
listUser.add("wjy");
listUser.add("端口号:"+serverPort);
return listUser;
} @RequestMapping("/getMemberServiceApi")
public String getMemberServiceApi() {
return "this is 会员 服务工程";
} }

修改OrderController:

package com.wjy.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import com.wjy.service.OrderMemberService; @RestController
public class OrderController {
@Autowired
private OrderMemberService orderMemberService; @RequestMapping("/getOrderUserAll")
public List<String> getOrderUserAll() {
System.out.println("订单服务开始调用会员服务");
return orderMemberService.getOrderUserAll(); } @RequestMapping("/getOrderServiceApi")
public String getOrderServiceApi() {
return "this is 订单服务工程";
}
}

测试验证:

发送请求http://127.0.0.1:8769/api-member/getMemberServiceApi转发到http://127.0.0.1:8762/getMemberServiceApi

发送请求http://127.0.0.1:8769/api-order/getOrderServiceApi转发到http://127.0.0.1:8764/getOrderServiceApi

6、服务过滤类:

package com.wjy;

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 MyFilter extends ZuulFilter { private static Logger log = LoggerFactory.getLogger(MyFilter.class); @Override
public String filterType() {
return "pre";
} @Override
public int filterOrder() {
return 0;
} public boolean shouldFilter() {
return true;
} public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
log.info(String.format("%s >>> %s", request.getMethod(), request.getRequestURL().toString()));
Object accessToken = request.getParameter("token");
String refer = request.getHeader("refer"); if (accessToken != null) {
return null;
}
log.warn("token is empty");
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
try {
ctx.getResponse().getWriter().write("token is empty");
} catch (Exception e) {
}
return null; }
}

测试验证:

发送请求http://127.0.0.1:8769/api-member/getUserList?token=123456789

发送请求http://127.0.0.1:8769/api-member/getUserList

最新文章

  1. java中的 FileWriter类 和 FileReader类的一些基本用法
  2. Eclipse问题集锦
  3. 手机端布局 - rem计算
  4. 前端打包/自动化构建工具:gulp
  5. 纯CSS3实现轮播切换效果
  6. GetStartedWithWin10Develop
  7. And Then There Was One
  8. [Oracle]Oracle学习小结(1)
  9. 快学Scala第一部分
  10. ZOJ 3822 可能性DP
  11. 【转载】 Spark性能优化:资源调优篇
  12. ASP.NET Core中使用GraphQL - 第三章 依赖注入
  13. 伪指令 ENTRY 与 END
  14. ie6常见的兼容性问题
  15. tedu训练营day03
  16. 整型 布尔值 字符串 for循环
  17. if 嵌套if 的先后顺序的区别 (自测)
  18. How to extract a complete list of extension types within a directory?
  19. Golang的字符编码介绍
  20. 图解Android View的scrollTo(),scrollBy(),getScrollX(), getScrollY()

热门文章

  1. 题解:[HAOI2008]下落的圆盘
  2. vo bo po dao pojo dto
  3. React.js Tutorial: React Component Lifecycle
  4. LeetCode 934. Shortest Bridge
  5. 洛谷 P4158 [SCOI2009]粉刷匠 题解
  6. 解决mysql无法显示中文/MySQL中文乱码问号等问题
  7. flag&amp;to do list&amp;note
  8. saltstack自动化运维工具搭建个人笔记
  9. Sequelize 数据类型
  10. nginx之allow、deny