Gateway路由配置
两种方法,一种是通过application.yml文件配置,一种是写一个config的bean类,两种只取其一。
yml配置
配置多个路由routes
spring:
application:
name: gateway-20000
cloud:
gateway:
routes: #配置路由,本质是list集合List<RouteDefinition> routes
- id: member_route01
#gateway 的 url=uri+Path
# gateway发来 http://localhost:20000/member/get/1
# 拆分http://localhost:20000 + /member/get/1
# /member/get/1 与断言Path=/member/get/**匹配
# 后 url=uri+Path= http://localhost:10001/member/get/1
uri: http://localhost:10001
predicates: #断言
- Path=/member/get/**
- id: member_route02
uri: http://localhost:10001
predicates:
- Path=/member/save
- id: member_route03
uri: http://www.baidu.com
predicates:
- Path=/
config配置
@Configuration
public class GateWayRoutesConfig {
//配置 cloud:
// gateway:
// routes 路由
@Bean
public RouteLocator myRouteLocator04(RouteLocatorBuilder routeLocatorBuilder){
RouteLocatorBuilder.Builder routes = routeLocatorBuilder.routes();
// - id: member_route02
// uri: http://localhost:10001
// predicates:
// - Path=/member/save
// 这里用了lambda表达式 r -> r.path
return routes.route("member_route04",r -> r.path("/member/get/**")
.uri("http://localhost:10001")).build();
}
}
通过使用routeLocatorBuilder创建一个路由,然后通过route方法来进行配置,其中
r -> r.path("/member/get/**") .uri("http://localhost:10001")
是lambda表达式,返回的是函数接口Function<PredicateSpec, AsyncBuilder>
route方法底层源码,
public RouteLocatorBuilder.Builder route(String id, Function<PredicateSpec, AsyncBuilder> fn) {
AsyncBuilder routeBuilder = (AsyncBuilder)fn.apply((new RouteLocatorBuilder.RouteSpec(this)).id(id));
this.add(routeBuilder);
return this;
}
r表示PredicateSpec类,也就是说,函数接口Function<A, B>是通过传入A类,返回B类,.path和uri也就是PredicateSpec类的方法,其中apply则是函数接口Function的方法
@FunctionalInterface
public interface Function<T, R> {
/**
* Applies this function to the given argument.
*
* @param t the function argument
* @return the function result
*/
R apply(T t);
R apply(T t) 就是传入T参数,根据t设置对应的R类型(比如new R(t)),返回R。
负载均衡算法配置
在config层只需添加算法bean
@Configuration public class RibbonRule { //配置自己的负载均衡算法 @Bean public IRule myRibbonRule(){ //设置算法RandomRule:随机请求 return new RandomRule(); } }
然后再运行类添加注解@RibbonClient指定算法即可
@RibbonClient(name = "MEMBER-SERVICE-PROVIDER",configuration = RibbonRule.class) //指定负载均衡算法为RibbonRule类中的myRibbonRule(RandomRule算法)