包含三大部分(即三个工程):
- 1、Eureka服务注册中心(工程名:Test_Eureka_Server)
- 2、一个服务(工程名:Test_Eureka_Client)
- 3、Zuul路由和过滤器(工程名:Test_Zuul_Filter)
1、创建工程
** 创建Springboot工程(Spring Cloud微服务)
** 三个工程的创建只介绍依赖的选择:
- Test_Eureka_Server:选择Spring Cloud Discovery->Eureka Server
- Test_Eureka_Client:选择 ①Web->Spring Web
②Spring Cloud Discovery->Eureka Server - Test_Zuul_Filter:选择 ①Spring Cloud Discovery->Eureka Server
②Spring cloud Routing->Zuul
2、服务注册中心Test_Eureka_Server
- 第一步:配置文件application.properties
server.port=1111
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
eureka.client.service-url.defaultZone=http://localhost:${server.port}/eureka/
- 第二步:为启动类加@EnableEurekaServer注解
@SpringBootApplication
@EnableEurekaServer //作为服务注册中心
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 第三步:运行该项目后,打开浏览器访问localhsot:1111,可以看到Spring Eureka服务注册中心
3、一个服务
- 第一步:配置文件
#客户端服务注册配置
spring.application.name=test_service_1
spring.freemarker.enabled=false
spring.thymeleaf.enabled=false
#指定注册中心
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
server.port=2222
#网关注册配置
#可以用下列两种方式的任何一种显式路径的方式指定负载均衡将 导向的服务
#zuul.routes.cars.url=http;//localhost:2288
zuul.routes.cars.serviceId=test-service
- 第二步:给启动类加@EnableEurekaClient
@SpringBootApplication
@EnableEurekaClient //作为一个服务,会注册到服务注册中心EurekaServer
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
- 第三步:创建一个controller
@Controller
public class TestDemoController {
@RequestMapping("testDemo")
@ResponseBody
public String testDemo(String userId){
return "访问测试testDemoController成功。token:"+userId;
}
}
- 第四步:在启动服务注册中心之后,启动该项目,可以在服务注册中心看到,该服务会被注册。
4、zuul路由和过滤器
- 第一步:配置文件
spring.application.name=test-zuul-filter
server.port=3333
#指定服务注册中心
eureka.client.service-url.defaultZone=http://localhost:1111/eureka/
#这里写注册的服务的名字application.name
zuul.routes.test-service.path=/test_service_1/**
zuul.routes.test-service.serviceId=test_service_1
- 第二步:给启动类加@EnableZuulProxy注解
@SpringBootApplication
@EnableZuulProxy
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public TestZuulFilter testZuulFilter(){
return new TestZuulFilter();
}
}
- 此时,启动该服务会被自动注册到服务中心。点击服务中心的Status列,该服务对应的绿色链接。
- 从该对外暴露的端口来进行访问:http://desktop-sjh626h:3333/
- 访问服务(controller)http://desktop-sjh626h:3333/test_service_1/testDemo?userId=tong
- 第三步:ZuulFilter过滤器(鉴权:要求的参数是否携带)
新建一个类,集成ZuulFilter类,实现其中的方法
package com.zuulfilter.demo;
import com.netflix.zuul.ZuulFilter;
import com.netflix.zuul.context.RequestContext;
import javax.servlet.http.HttpServletRequest;
/**
* @Author: tongys
* @Date: 2019/9/26
*/
public class TestZuulFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre"; //过滤器类型:pre,routing,error,post(触发时机不同)
}
@Override
public int filterOrder() {
return 0;
}
@Override
public boolean shouldFilter() {
return true; //返回true表示过滤器生效
}
@Override
public Object run() {
System.out.println("已进入zuul filter……");
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
Object userId = request.getParameter("userId");
// ctx.getResponse().setCharacterEncoding("GBK"); //使用GBK编码可以避免中文响应信息的乱码
if (userId == null){
ctx.setSendZuulResponse(false);
ctx.setResponseStatusCode(401);
ctx.setResponseBody("access refused, userID can not be null.");
return null;
}else if(!userId.equals("tong")){
ctx.setResponseStatusCode(402);
ctx.setSendZuulResponse(false);
ctx.setResponseBody("access refused, userID is not excited.");
return null;
}
//鉴权通过
// ctx.setResponseStatusCode(200);
// ctx.setSendZuulResponse(true);
// String token = userId.toString();
// ctx.addZuulRequestHeader("Authorization",token);
ctx.setResponseBody("access success.");//如果注释掉这里,页面会显示controller的响应内容
return null;
}
}
- 重启项目后,访问http://desktop-sjh626h:3333/test_service_1/testDemo?userId=tong
- 如果不携带参数或携带错误的参数会有不同的提示信息。
**** 完成