网关采用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