(六)路由规则

路由规则

功能配置

路由功能,就是 消费者 -> 提供者
即是根据配置的路由规则,找到提供者,
比如,读写分离 路由规则:
读路由:
method = find*,list*,get*,is* => host = 172.22.3.94,172.22.3.95,172.22.3.96
这条规则会判断读方法,会调用172.22.3.94,172.22.3.95,172.22.3.96这几个提供者的服务
写路由:
method != find*,list*,get*,is* => host = 172.22.3.97,172.22.3.98
这条规则会判断读方法,会调用172.22.3.97,172.22.3.98这几个提供者的服务
除读写分离路由规则,还有其他规则:http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-%E8%B7%AF%E7%94%B1%E8%A7%84%E5%88%99

路由名称:name
服务名:service(一个路由规则只能对应一个服务)
优先级别:priority(优级越高排序越前)

route://0.0.0.0/lam.dubbo.privider.LoginService?category=routers&router=condition&runtime=false&enabled=true&priority=1&force=false&dynamic=false&name=LoginServiceRouter&rule=URL.encode(method = find*,list*,get*,is* => host = 172.22.3.94,172.22.3.95,172.22.3.96)

下面是路由功能的实现:

private List<Invoker<T>> route(List<Invoker<T>> invokers, String method) {
    Invocation invocation = new RpcInvocation(method, new Class<?>[0], new Object[0]);
    List<Router> routers = getRouters();
    if (routers != null) {
        for (Router router : routers) {
            if (router.getUrl() != null && ! router.getUrl().getParameter(Constants.RUNTIME_KEY, true)) {
                invokers = router.route(invokers, getConsumerUrl(), invocation);//4处
            }
        }
    }
    return invokers;
}

从上面4处的invocation参数,看出是对方法一个一个来进行路由映射方法的提供者列表的,route实现,看下面源码:

public <T> List<Invoker<T>> route(List<Invoker<T>> invokers, URL url, Invocation invocation) throws RpcException {
    if (invokers == null || invokers.size() == 0) {
        return invokers;
    }
    try {
        if (! matchWhen(url)) { //5处
            return invokers;
        }
        List<Invoker<T>> result = new ArrayList<Invoker<T>>();
        if (thenCondition == null) {
            logger.warn("The current consumer in the service blacklist. consumer: " + NetUtils.getLocalHost() + ", service: " + url.getServiceKey());
            return result;
        }
        for (Invoker<T> invoker : invokers) {
            if (matchThen(invoker.getUrl(), url)) { //6处
                result.add(invoker);
            }
        }
        if (result.size() > 0) {
            return result;
        } else if (force) {
            logger.warn("The route result is empty and force execute. consumer: " + NetUtils.getLocalHost() + ", service: " + url.getServiceKey() + ", router: " + url.getParameterAndDecoded(Constants.RULE_KEY));
            return result;
        }
    } catch (Throwable t) {
        logger.error("Failed to execute condition router rule: " + getUrl() + ", invokers: " + invokers + ", cause: " + t.getMessage(), t);
    }
    return invokers;
}

其中
代码的5处,判断消费者是否匹配路由规则的左边
比如,路由规则method = find*,list*,get*,is* => host = 172.22.3.94,172.22.3.95,172.22.3.96,
规则左边,即判断消费者调用的方法是读方法
代码的6处,判断提供者是否匹配路由规则的右边
就像上面这条路由规则,即判断提供者是否这几个host的服务,否则不会被映射到方法的提供列表。

自己写了个RPC:

https://github.com/nytta

可以给个star,^0^.

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Flask中的路由规则定义了浏览器请求何时应该与哪个视图函数进行匹配。以下是一些常见的路由规则: 1. 常规路由规则 ```python @app.route('/hello') def hello(): return 'Hello, World!' ``` 在上面的代码中,`/hello`是路由规则,它将匹配网站的根目录后面跟着`/hello`的任何请求,并调用`hello`函数来处理它。 2. 动态路由规则 ```python @app.route('/user/<username>') def show_user_profile(username): return 'User %s' % username ``` 这个路由规则将匹配网站根目录后面跟着`/user/`的任何请求,并将`<username>`作为变量传递给`show_user_profile`函数。例如,如果请求的URL是`/user/john`,`username`变量将被设置为`"john"`。 3. 指定HTTP方法 ```python @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': return do_the_login() else: return show_the_login_form() ``` 这个路由规则将匹配网站根目录后面跟着`/login`的任何请求,但只有当请求方法是`GET`或`POST`时才会匹配。如果请求方法是`POST`,则调用`do_the_login`函数来处理它,否则调用`show_the_login_form`函数。 4. 指定URL参数类型 ```python @app.route('/user/<int:user_id>') def show_user(user_id): return 'User %d' % user_id ``` 这个路由规则将匹配网站根目录后面跟着`/user/`的任何请求,并将`<user_id>`作为整数变量传递给`show_user`函数。如果请求的URL是`/user/42`,`user_id`变量将被设置为`42`。 5. 指定多个路由规则 ```python @app.route('/') @app.route('/index') def index(): return 'Index Page' ``` 这个路由规则将匹配网站根目录或者跟着`/index`的任何请求,并调用`index`函数来处理它。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值