搭建一个自己的平台的心理路程之网关

2020-06-13  本文已影响0人  东南枝下

网关采用zuul,网络上有大量教程,稍加配置就好

1、引入依赖


 <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            <version>2.0.2.RELEASE</version>
        </dependency>

为了注册到上一集的eureka里,所以加入了eureka-client依赖

2、配置文件


zuul:
  host:
    connect-timeout-millis: 15000 #HTTP连接超时大于Hystrix的超时时间
    socket-timeout-millis: 60000   #socket超时
  sensitive-headers:
  routes:
    jzero-oauth: /joth/**
    jzero-platform: /jpfm/**
    
eureka:
  client:
    registerWithEureka: true
    fetchRegistry: true
    serviceUrl:
      defaultZone: http://jzero.org:8000/eureka/
      

zuul.routes 为需要路由的服务和路由地址

3、启动类


@EnableZuulProxy
@EnableEurekaClient
@SpringBootApplication
public class GatewayApplication {
    public static void main(String[] args){
        SpringApplication.run(GatewayApplication.class,args);
    }
}

4、动态路由(非原创)

如果以后有新的微服务加入,总不能频繁更改网关配置重启吧,所以这里得想个办法实现动态路由,比如将路由信息写入数据库中,动态的去读取。

在查阅一些资料后从http://blog.csdn.net/u013815546/article/details/68944039中获得解决方法。

自定义路由定位器:


public class CustomRouteLocator extends SimpleRouteLocator implements RefreshableRouteLocator {

    private ZuulProperties properties;

    @Autowired
    private RouteMapper routeMapper;

    public CustomRouteLocator(String servletPath, ZuulProperties properties) {
        super(servletPath, properties);
        this.properties = properties;
    }

    @Override
    public void refresh() {
        doRefresh();
    }

    @Override
    protected Map<String, ZuulProperties.ZuulRoute> locateRoutes() {
        //从application.properties中加载路由信息
        LinkedHashMap<String, ZuulProperties.ZuulRoute> routesMap = new LinkedHashMap<>(super.locateRoutes());
        //从db中加载路由信息
        List<RouteDTO> cuxRouteList = routeMapper.listRoute();
        for (RouteDTO route : cuxRouteList) {
            //自定义的路由信息
            ZuulProperties.ZuulRoute customZuulRoute = new ZuulProperties.ZuulRoute();
            customZuulRoute.setId(route.getId() + route.getServiceId());
            customZuulRoute.setPath(route.getPath());
            customZuulRoute.setServiceId(route.getServiceId());
            customZuulRoute.setUrl(route.getUrl());
            routesMap.put(route.getPath(), customZuulRoute);
        }
        System.out.println("==========db route map=========");
        System.out.println(cuxRouteList);
        //优化一下配置
        LinkedHashMap<String, ZuulProperties.ZuulRoute> values = new LinkedHashMap<>();
        for (Map.Entry<String, ZuulProperties.ZuulRoute> entry : routesMap.entrySet()) {
            String path = entry.getKey();
            // Prepend with slash if not already present.
            if (!path.startsWith("/")) {
                path = "/" + path;
            }
            if (StringUtils.hasText(this.properties.getPrefix())) {
                path = this.properties.getPrefix() + path;
                if (!path.startsWith("/")) {
                    path = "/" + path;
                }
            }
            values.put(path, entry.getValue());
        }
        return values;
    }
}

为了复习下mybatis的配置,我这里采用的是mybatis来读取数据库中的路由信息

配置这个自定义的路由定位器:


@Configuration
public class CustomZuulConfig {
    @Autowired
    ZuulProperties zuulProperties;
    @Autowired
    ServerProperties server;

    @Bean
    public CustomRouteLocator routeLocator() {
        CustomRouteLocator routeLocator = new CustomRouteLocator(this.server.getServerHeader(), this.zuulProperties);

        return routeLocator;
    }
}

至此,实现了从数据库中动态获取路由信息

mybatis 配置:

1、引入依赖

<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>1.3.0</version>
</dependency>

2、配置文件

spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    url: ${SPRING_DATASOURCE_URL:jdbc:mysql://db.jzero.org/jzero_platform}
    username: ${SPRING_DATASOURCE_USERNAME:root}
    password: ${SPRING_DATASOURCE_PASSWORD:root}

mybatis:
  mapperLocations:
    - classpath*:/mapper/*Mapper.xml
    - classpath*:/mapper/*/*Mapper.xml
  configuration:
    mapUnderscoreToCamelCase: true

3、创建DTO接收数据

package org.jzero.gateway.controller.dto;

import lombok.Data;

@Data
public class RouteDTO {
    private Long id;
    private String serviceId;
    private String path;
    private String url;
}

4、定义Mapper接口

编写获取数据的接口函数


package org.jzero.gateway.mapper;

import org.apache.ibatis.annotations.Mapper;
import org.jzero.gateway.controller.dto.RouteDTO;

import java.util.List;

@Mapper
public interface RouteMapper {
    List<RouteDTO> listRoute();
}


5、在xml中编写sql

在 mybatis.mapperLocations配置的路径下


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.jzero.gateway.mapper.RouteMapper">

    <select id="listRoute" resultType="org.jzero.gateway.controller.dto.RouteDTO">
      select *
      from jpfm_route
      where enabled_flag=1
    </select>

    <select id="insertRoute" resultType="org.jzero.gateway.controller.dto.RouteDTO">
      select *
      from jpfm_route
      where enabled_flag=1
    </select>
</mapper>

参考文档: http://blog.csdn.net/u013815546/article/details/68944039

上一篇 下一篇

猜你喜欢

热点阅读