【Eureka服务注册】与【Zuul路由和过滤器】

包含三大部分(即三个工程):

  • 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
    结果- 如果不携带参数或携带错误的参数会有不同的提示信息。
    **** 完成
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值