飞道的博客

Nginx gateway集群和动态网关

325人阅读  评论(0)

网关怎么实现集群:使用nginx实现。

基于nginx部署gateway集群

1、将网关项目多个部署启动
例如:
网关1 127.0.0.1:81
网关1 127.0.0.1:82


3、各个微服务如何知道是哪个网关请求的
在网关的过滤器中给请求头添加可以区别网关的信息。

动态Gateway

动态网关:任何配置都实现不用重启网关服务器都可以及时刷新。
实现思路:
1、分布式配置中心,阅读性差。
2、基于数据库表结构设计。

gateway提供对应的接口:1、直接新增路由;2、直接修改路由

使用api添加gateway 路由,直接注入该bean 调用 loadRoute1方法就可以添加路由策略了。


  
  1. @Service
  2. public class GatewayService implements ApplicationEventPublisherAware {
  3. private ApplicationEventPublisher publisher;
  4. @Autowired
  5. private RouteDefinitionWriter routeDefinitionWriter;
  6. @Override
  7. public void setApplicationEventPublisher( ApplicationEventPublisher applicationEventPublisher) {
  8. this. publisher = applicationEventPublisher;
  9. }
  10. public void initAllRoute( ) {
  11. // 从数据库查询配置的网关配置
  12. List< GatewayRouteEntity> gateWayEntities = gatewayRouteMapper. gateWayAll();
  13. for ( GatewayRouteEntity gw :
  14. gateWayEntities) {
  15. loadRoute(gw);
  16. }
  17. }
  18. public String loadRoute1( ) {
  19. RouteDefinition definition = new RouteDefinition();
  20. Map< String, String> predicateParams = new HashMap<>( 8);
  21. PredicateDefinition predicate = new PredicateDefinition();
  22. FilterDefinition filterDefinition = new FilterDefinition();
  23. Map< String, String> filterParams = new HashMap<>( 8);
  24. // 如果配置路由type为0的话 则从注册中心获取服务
  25. URI uri = UriComponentsBuilder. fromUriString( "lb://kaico-member/"). build(). toUri();
  26. // 定义的路由唯一的id
  27. definition. setId( "member");
  28. predicate. setName( "Path");
  29. //路由转发地址
  30. predicateParams. put( "pattern", "/member/**");
  31. predicate. setArgs(predicateParams);
  32. // 名称是固定的, 路径去前缀
  33. filterDefinition. setName( "StripPrefix");
  34. filterParams. put( "_genkey_0", "1");
  35. filterDefinition. setArgs(filterParams);
  36. definition. setPredicates( Arrays. asList(predicate));
  37. definition. setFilters( Arrays. asList(filterDefinition));
  38. definition. setUri(uri);
  39. routeDefinitionWriter. save( Mono. just(definition)). subscribe();
  40. this. publisher. publishEvent( new RefreshRoutesEvent( this));
  41. return "success";
  42. }
  43. }

使用数据库实现动态路由

根据上面的案例,将配置信息添加到数据库中(数据库表的设计只要符合只用场景就可以了,没有什么特别要求),在调用相关的api添加到gateway中即可。

参考学习文档:https://www.cnblogs.com/crazymakercircle/p/11704077.html

官放文档:https://docs.spring.io/spring-cloud-gateway/docs/3.0.5-SNAPSHOT/reference/html/#gateway-starter


转载:https://blog.csdn.net/qq_19734597/article/details/127363021
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场