精华内容
下载资源
问答
  • 问题前提条件: ①项目调用多个 c++ 服务 (每个服务设定了不定数的个线程,访问此服务的时候,不能超过此线程数) ②访问服务的前提要
    1. 问题前提条件:
      ①本项目调用多个 c++ 服务(集群) (每个服务设定了不定数的个线程,访问此服务的时候,不能超过此服务发可用线程数)
      ②本项目访问c++服务的前提要随机选择可用服务(比如有4个c++服务集群-每一个服务配置了线程为10个,其中1号服务已经宕机,2号服务的进程数已经到10,那么可用的服务就只有3和4号服务器)
      ③客户调用本项目 的 任务 放到队列中去, 本项目开辟新线程去在队列中有序取出任务
      ④调用C++服务集群的时候设置有超时(一段时间内找不到含有可用连接数的服务),返回超时code

    2. 解决问题方案(比如有4个c++服务器集群):
      ①本项目启动后初始化4个服务类分别代表4个服务器,含有url(IP地址) , totalThreadCount(最高并发数) , usedThreadCount(已用还没有释放并发数) , isUsable(服务是否宕机) , port(服务端口号) 属性, (在配置文件中读取参数设置属性), 访问前对这4个服务类进行来实现对c++服务集群可用性的校验
      ②启动项目后 , 开启一个监听器(开辟一个线程,每两秒一次监听),通过初始化的四个服务类对4个服务集群进行校验,查询是否存在宕机服务器(宕机设置isUsable为false)
      ③任务来了放入队列中
      ④项目启动后开启一个监听器,监听任务队列中是否存在任务,有的话执行任务

    3. 自己模拟测试(项目中更加严谨)
      在这里插入图片描述

    展开全文
  • 三个类: ServiceAProvider ServiceBProvider ...ServiceAProvider提供的服务名service-A,指向IP为192.168.58.130 ...ServiceBProvider提供的服务名service-A,指向IP为192.168....当有消费者请求时,随机地选取s...

    三个类:

    ServiceAProvider

    ServiceBProvider

    ServiceConsumer

    其中

    ServiceAProvider提供的服务名service-A,指向IP为192.168.58.130

    ServiceBProvider提供的服务名service-A,指向IP为192.168.58.131

    当有消费者请求时,随机地选取service-A列表的服务器提供服务

    ServiceConsumer 为消费者类

    依赖:

    <dependency>
    			<groupId>org.apache.zookeeper</groupId>
    			<artifactId>zookeeper</artifactId>
    			<version>3.4.5-cdh5.1.0</version>
    		</dependency>
    		<dependency>
    			<groupId>org.apache.helix</groupId>
    			<artifactId>helix-core</artifactId>
    			<version>0.6.4</version>
    		</dependency>


    github源码下载地址:

    https://github.com/Bellonor/myhadoop2.x/tree/master/myhadoop2.x/src/main/java/com/jamesfen/zookeeper


    详见下面的代码:

    服务提供者ServiceAProvider类的源码为:

    package com.jamesfen.zookeeper;
    import <span id="15_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="15_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=java&k0=java&kdi0=0&luki=9&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="15" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">java</span></a></span>.net.InetAddress;
    import org.I0Itec.zkclient.ZkClient;
    public class ServiceAProvider {
    
    	 private String serviceName = "service-A";
    	   
    	    //向zookeeper注册服务
    	    public void init() throws Exception{
    	        String <span id="16_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="16_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=server&k0=server&kdi0=0&luki=7&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="16" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">server</span></a></span>List = "192.168.58.11:2181";
    	        String PATH ="/configcenter";//根节点路径
    	        ZkClient zkClient = new ZkClient(serverList);
    	        boolean rootExists = zkClient.exists(PATH);
    	        if(!rootExists){
    	            zkClient.createPersistent(PATH);
    	        }
    	      //判断是否存在,不存在则创建服务节点
    	        boolean serviceExists = zkClient.exists(PATH + "/" + serviceName);
    	        if(!serviceExists){
    	            zkClient.createPersistent(PATH + "/" + serviceName);
    	        }
    	        
    	        //註冊當前服務
    	        InetAddress addr =InetAddress.getLocalHost();
    	        //String ip= addr.getHostAddress().toString();
    	        String ip = "192.168.58.130";
    	        
    	        //創建當前服務器節點
    	        zkClient.createEphemeral(PATH + "/" + serviceName + "/" + ip);
    	        
    	        System.out.println("提供的服务节点名称为:"+PATH + "/" + serviceName + "/" + ip);
    	    }
    	    //提供服务
    	    public void provide(){
    	        
    	    }
    	    public static void main(String[]args) throws Exception {
    	        ServiceAProvider service = new ServiceAProvider();
    	        service.init();
    	        
    	        Thread.sleep(1000*60*60*24);
    	    }
    
    }
    

    服务提供者ServiceBProvider类源码为

    package com.jamesfen.zookeeper;
    import <span id="10_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="10_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=java&k0=java&kdi0=0&luki=9&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="10" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">java</span></a></span>.net.InetAddress;
    import org.I0Itec.zkclient.ZkClient;
    public class ServiceBProvider {
       //服务名仍然为 A,这样是为了,一个服务名有两个台机器在服务,才能做<span id="11_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="11_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=%B8%BA%D4%D8%BE%F9%BA%E2&k0=%B8%BA%D4%D8%BE%F9%BA%E2&kdi0=0&luki=8&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="11" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">负载均衡</span></a></span>.
    	private String serviceName = "service-A";
    	   
        //向zookeeper注册服务
        public void init() throws Exception{
            String <span id="12_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="12_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=server&k0=server&kdi0=0&luki=7&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="12" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">server</span></a></span>List = "192.168.58.11:2181";
            String PATH ="/configcenter";//根节点路径
            ZkClient zkClient = <span id="13_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="13_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=new&k0=new&kdi0=0&luki=6&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="13" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">new</span></a></span> ZkClient(serverList);
            boolean rootExists = zkClient.exists(PATH);
            if(!rootExists){
                zkClient.createPersistent(PATH);
            }
            
            boolean serviceExists = zkClient.exists(PATH + "/" + serviceName);
            if(!serviceExists){
                zkClient.createPersistent(PATH + "/" + serviceName);//創建服務節點
            }
            
            //註冊當前服務
            InetAddress addr =InetAddress.getLocalHost();
            //String ip= addr.getHostAddress().toString();
            String ip = "192.168.58.131";
            
            //創建當前服務器節點
            zkClient.createEphemeral(PATH + "/" + serviceName + "/" + ip);
            
            System.out.println("提供的服务节点名称为:"+PATH + "/" + serviceName + "/" + ip);
        }
        //提供服务
        public void provide(){
            
        }
        public static void main(String[]args) throws Exception {
            ServiceBProvider service = <span id="14_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="14_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=new&k0=new&kdi0=0&luki=6&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="14" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">new</span></a></span> ServiceBProvider();
            service.init();
            
            Thread.sleep(1000*60*60*24);
        }
    
    }
    

    消费者类源码为:

    package com.jamesfen.zookeeper;
    import <span id="0_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="0_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=java&k0=java&kdi0=0&luki=9&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="0" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">java</span></a></span>.util.ArrayList;
    import java.util.List;
    import java.util.Random;
    import org.I0Itec.zkclient.IZkChildListener;
    import org.I0Itec.zkclient.ZkClient;
    public class ServiceConsumer {
    
    	private List<String> <span id="1_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="1_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=server&k0=server&kdi0=0&luki=7&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="1" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">server</span></a></span>List = <span id="2_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="2_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=new&k0=new&kdi0=0&luki=6&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="2" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">new</span></a></span> ArrayList<String>();
    	   
        private String serviceName ="service-A";
       
        //初始化服务地址信息
        public void init(){     
            String zkServerList ="192.168.58.11:2181";
            String SERVICE_PATH="/configcenter/"+serviceName;//服务节点路径
            ZkClient zkClient = new ZkClient(zkServerList);
            
            boolean serviceExists =zkClient.exists(SERVICE_PATH);
            if(serviceExists){
                <span id="3_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="3_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=server&k0=server&kdi0=0&luki=7&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="3" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">server</span></a></span>List =zkClient.getChildren(SERVICE_PATH);
            }else{
                throw <span id="4_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="4_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=new&k0=new&kdi0=0&luki=6&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="4" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">new</span></a></span> RuntimeException("service not exist!");
            }
            
            //注册事件监听
            zkClient.subscribeChildChanges(SERVICE_PATH,new IZkChildListener(){
                //@Override
                public void handleChildChange(String parentPath, List<String> currentChilds)throws Exception{
                    serverList = currentChilds;
                }      
            });
        }
       
       
        //消费服务
        public void consume(){
            //通过负责均衡<span id="5_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="5_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=%CB%E3%B7%A8&k0=%CB%E3%B7%A8&kdi0=0&luki=2&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="5" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">算法</span></a></span>,得到一台<span id="6_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="6_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=%B7%FE%CE%F1%C6%F7&k0=%B7%FE%CE%F1%C6%F7&kdi0=0&luki=5&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="6" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">服务器</span></a></span>进行调用
            int index = getRandomNum(0,1);      
            System.out.println("调用" + <span id="7_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="7_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=server&k0=server&kdi0=0&luki=7&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="7" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">server</span></a></span>List.get(index)+"提供的服务:" + serviceName);
        }
       
        public int getRandomNum(int min,int <span id="8_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="8_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=max&k0=max&kdi0=0&luki=3&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="8" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">max</span></a></span>){  
            Random rdm = <span id="9_nwp" style="width: auto; height: auto; float: none;"><a target=_blank id="9_nwl" href="http://cpro.baidu.com/cpro/ui/uijs.php?adclass=0&app_id=0&c=news&cf=1001&ch=0&di=128&fv=19&is_app=0&jk=c0f10e83569e90ad&k=new&k0=new&kdi0=0&luki=6&mcpm=0&n=10&p=baidu&q=35027180_cpr&rb=0&rs=1&seller_id=1&sid=ad909e56830ef1c0&ssp2=1&stid=9&t=tpclicked3_hc&td=2282542&tu=u2282542&u=http%3A%2F%2Fwww%2Ezgxue%2Ecom%2F168%2F1686059%2Ehtml&urlid=0" target="_blank" mpid="9" style="color: rgb(51, 51, 51); text-decoration: none;"><span style="color: rgb(0, 0, 255); width: auto; height: auto;">new</span></a></span> Random();  
            return rdm.nextInt(max-min+1)+min;
        }  
       
        public static void main(String[] args)throws Exception {
            ServiceConsumer consumer = new ServiceConsumer();   
                   
            consumer.init();
            consumer.consume();
            
            Thread.sleep(1000*60*60*24);
        }
    
    }
    展开全文
  • 1、客户端请求认证服务进行认证。 2、认证服务认证通过向浏览器cookie写入token(身份令牌) 认证服务请求用户中心查询用户信息。 认证服务请求Spring Security申请令牌。 认证服务将token(身份令牌)和jwt令牌存储至...

    在这里插入图片描述
    业务流程说明如下:
    1、客户端请求认证服务进行认证。
    2、认证服务认证通过向浏览器cookie写入token(身份令牌)
    认证服务请求用户中心查询用户信息。
    认证服务请求Spring Security申请令牌。
    认证服务将token(身份令牌)和jwt令牌存储至redis中。
    认证服务向cookie写入 token(身份令牌)。
    3、前端携带token请求认证服务获取jwt令牌
    前端获取到jwt令牌并存储在sessionStorage。
    前端从jwt令牌中解析中用户信息并显示在页面。
    4、前端携带cookie中的token身份令牌及jwt令牌访问资源服务
    前端请求资源服务需要携带两个token,一个是cookie中的身份令牌,一个是http header中的jwt令牌
    前端请求资源服务前在http header上添加jwt请求资源
    5、网关校验token的合法性
    用户请求必须携带 token身份令牌和jwt令牌
    网关校验redis中token是否合法,已过期则要求用户重新登录
    6、资源服务校验jwt的合法性并完成授权
    资源服务校验jwt令牌,完成授权,拥有权限的方法正常执行,没有权限的方法将拒绝访问。
    在这里插入图片描述

    在这里插入图片描述

    BCrypt 随机加盐加密

    早期使用md5对密码进行编码,每次算出的md5值都一样,这样非常不安全,Spring Security推荐使用
    BCryptPasswordEncoder对密码加随机盐,每次的Hash值都不一样,安全性高。
    1、BCryptPasswordEncoder案例程序如下:

    @Test
        public void testPasswrodEncoder(){
            //原始密码
            String password = "111111";
            BCryptPasswordEncoder bCryptPasswordEncoder = new BCryptPasswordEncoder();
            //使用BCrypt加密,每次加密使用一个随机盐
            for(int i=0;i<10;i++){
                String encode = bCryptPasswordEncoder.encode(password);
                System.out.println(encode);
                //校验
                boolean matches = bCryptPasswordEncoder.matches(password, encode);
                System.out.println(matches);
            }
    
        }
    

    spring cloud的应用方法:BCryptPasswordEncoder:
    在这里插入图片描述

    //采用bcrypt对密码进行编码
        @Bean
        public PasswordEncoder passwordEncoder() {
            return new BCryptPasswordEncoder();
        }
    

    4 Zuul 网关 搭建实际案例工程(以后复制出来改)

    4.1 需求分析
    网关的作用相当于一个过虑器、拦截器,它可以拦截多个系统的请求。
    本章节要使用网关校验用户的身份是否合法。
    Spring Cloud Zuul是整合Netflix公司的Zuul开源项目实现的微服务网关,它实现了请求路由、负载均衡、校验过
    虑等 功能。
    官方:https://github.com/Netflix/zuul

    Zuul与Nginx怎么配合使用?
    Zuul与Nginx在实际项目中需要配合使用,如下图,Nginx的作用是反向代理、负载均衡,Zuul的作用是保障微服
    务的安全访问,拦截微服务请求,校验合法性及负载均衡。
    pom.xml

    <!--网关的jar-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-zuul</artifactId>
            </dependency>
            <!--eureka的jar-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
            </dependency>
            <dependency>
                <groupId>com.xuecheng</groupId>
                <artifactId>xc-framework-model</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>com.xuecheng</groupId>
                <artifactId>xc-framework-common</artifactId>
                <version>1.0-SNAPSHOT</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>com.squareup.okhttp3</groupId>
                <artifactId>okhttp</artifactId>
            </dependency>
            <dependency>
                <groupId>com.netflix.feign</groupId>
                <artifactId>feign-okhttp</artifactId>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
            </dependency>
            <dependency>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
            </dependency>
            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
            </dependency>
    

    application.yml
    在这里插入图片描述

    server:
      port: 50201
      servlet:
        context-path: /api
    spring:
      application:
        name: xc-govern-gateway
      redis:
        host: ${REDIS_HOST:127.0.0.1}
        port: ${REDIS_PORT:6379}
        timeout: 5000 #连接超时 毫秒
        jedis:
          pool:
            maxActive: 3
            maxIdle: 3
            minIdle: 1
            maxWait: -1 #连接池最大等行时间 -1没有限制
    zuul:
      routes:
        manage-course:
          #表示只要是/api/course/开始的任意路径,都能通过该网关下发
          path: /course/**
          #该地址转发到哪个微服务名称,网关会从eureka中获取该服务名称下的服务实例的地址
          serviceId: xc-service-manage-course
          # 例子:将请求转发到http://localhost:31200/course
          #url: http://www.baidu.com #也可指定url,此url也可以是外网地址\
          strip-prefix: false #true:代理转发时去掉前缀,false:代理转发时不去掉前缀
          #默认zuul会屏蔽cookie,cookie不会传到下游服务,这里设置为空则取消默认的黑名单,如果设置了具体的头信息则不会传到下游服务
          sensitiveHeaders: #什么都不设置,就是允许任何携带的消息通过
          #   ignoredHeaders: 默认为空表示不过虑任何头
        xc-service-learning:  #路由名称,名称任意,保持所有路由名称唯一
          path: /learning/**
          serviceId: xc-service-learning #指定服务id,从Eureka中找到服务的ip和端口
          strip-prefix: false  #是否去掉前缀?
          sensitiveHeaders:   #头信息,是否拦截,空,为不拦截
        manage-cms:
          path: /cms/**
          serviceId: xc-service-manage-cms
          strip-prefix: false
          sensitiveHeaders:
        manage-sys:
          path: /sys/**
          serviceId: xc-service-manage-cms
          strip-prefix: false
          sensitiveHeaders:
        service-ucenter:
          path: /ucenter/**
          serviceId: xc-service-ucenter
          sensitiveHeaders:
          strip-prefix: false
        xc-service-manage-order:
          path: /order/**
          serviceId: xc-service-manage-order
          sensitiveHeaders:
          strip-prefix: false
    eureka:
      client:
        registerWithEureka: true #服务注册开关
        fetchRegistry: true #服务发现开关
        serviceUrl: #Eureka客户端与Eureka服务端进行交互的地址,多个中间用逗号分隔
          defaultZone: ${EUREKA_SERVER:http://localhost:50101/eureka/}
      instance:
        prefer-ip-address:  true  #将自己的ip地址注册到Eureka服务中
        ip-address: 127.0.0.1
        instance-id: ${spring.application.name}:${server.port} #指定实例id
    ribbon:
      MaxAutoRetries: 2 #最大重试次数,当Eureka中可以找到服务,但是服务连不上时将会重试,如果eureka中找不到服务则直接走断路器
      MaxAutoRetriesNextServer: 3 #切换实例的重试次数
      OkToRetryOnAllOperations: false  #对所有操作请求都进行重试,如果是get则可以,如果是post,put等操作没有实现幂等的情况下是很危险的,所以设置为false
      ConnectTimeout: 5000  #请求连接的超时时间
      ReadTimeout: 6000 #请求处理的超时时间
    

    GatewayApplication 启动类:

    @SpringBootApplication
    //此工程是一个zuul网关
    @EnableZuulProxy
    public class GatewayApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(GatewayApplication.class, args);
        }
    }
    

    AuthService

    import com.xuecheng.framework.utils.CookieUtil;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.data.redis.core.StringRedisTemplate;
    import org.springframework.stereotype.Service;
    import javax.servlet.http.HttpServletRequest;
    import java.util.Map;
    import java.util.concurrent.TimeUnit;
    
    @Service
    public class AuthService {
    
        @Autowired
        StringRedisTemplate stringRedisTemplate;
    
        //从头取出jwt令牌
        public String getJwtFromHeader(HttpServletRequest request){
            //取出头信息
            String authorization = request.getHeader("Authorization");
            if(StringUtils.isEmpty(authorization)){
                return null;
            }
            if(!authorization.startsWith("Bearer ")){
                return null;
            }
            //取到jwt令牌
            String jwt = authorization.substring(7);
            return jwt;
    
    
        }
        //从cookie取出token
        //查询身份令牌
        public String getTokenFromCookie(HttpServletRequest request){
            Map<String, String> cookieMap = CookieUtil.readCookie(request, "uid");
            String access_token = cookieMap.get("uid");
            if(StringUtils.isEmpty(access_token)){
                return null;
            }
            return access_token;
        }
    
        //查询令牌的有效期
         public long getExpire(String access_token){
            //key
             String key = "user_token:"+access_token;
             Long expire = stringRedisTemplate.getExpire(key, TimeUnit.SECONDS);
             return expire;
         }
    }
    

    LoginFilter 过滤器的配置类:

    import com.alibaba.fastjson.JSON;
    import com.netflix.zuul.ZuulFilter;
    import com.netflix.zuul.context.RequestContext;
    import com.netflix.zuul.exception.ZuulException;
    import com.xuecheng.framework.model.response.CommonCode;
    import com.xuecheng.framework.model.response.ResponseResult;
    import com.xuecheng.govern.gateway.service.AuthService;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Component;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    /** 身份校验过虑器,继承zuul过滤器
     * @author Administrator
     * @version 1.0
     **/
    
    @Component
    public class LoginFilter extends ZuulFilter {
    
        @Autowired
        AuthService authService;
    
        //过虑器的类型
        @Override
        public String filterType() {
            /**
             pre:请求在被路由之前执行
    
             routing:在路由请求时调用
    
             post:在routing和errror过滤器之后调用
    
             error:处理请求时发生错误调用
    
             */
            return "pre";
        }
    
        //过虑器序号,越小越被优先执行
        @Override
        public int filterOrder() {
            return 0;
        }
    
        @Override
        public boolean shouldFilter() {
            //返回true表示要执行此过虑器,false表示不执行这个过滤器
            return true;
        }
    
        //过虑器的内容
        //测试的需求:过虑所有请求,判断头部信息是否有Authorization,如果没有则拒绝访问,否则转发到微服务。
        @Override
        public Object run() throws ZuulException {
            RequestContext requestContext = RequestContext.getCurrentContext();
            //得到request
            HttpServletRequest request = requestContext.getRequest();
            //得到response
            HttpServletResponse response = requestContext.getResponse();
            //取cookie中的身份令牌
            String tokenFromCookie = authService.getTokenFromCookie(request);
            if(StringUtils.isEmpty(tokenFromCookie)){
                //拒绝访问
                access_denied();
                return null;
            }
            //从header中取jwt
            String jwtFromHeader = authService.getJwtFromHeader(request);
            if(StringUtils.isEmpty(jwtFromHeader)){
                //拒绝访问
                access_denied();
                return null;
            }
            //从redis取出jwt的过期时间
            long expire = authService.getExpire(tokenFromCookie);
            if(expire<0){
                //拒绝访问
                access_denied();
                return null;
            }
    
            return null;
        }
    
    
        //拒绝访问
        private void access_denied(){
            RequestContext requestContext = RequestContext.getCurrentContext();
            //得到response
            HttpServletResponse response = requestContext.getResponse();
            //拒绝访问的方法
            requestContext.setSendZuulResponse(false);
            //设置响应代码
            requestContext.setResponseStatusCode(200);
            //构建响应的信息
            ResponseResult responseResult = new ResponseResult(CommonCode.UNAUTHENTICATED);
            //转成json
            String jsonString = JSON.toJSONString(responseResult);
            requestContext.setResponseBody(jsonString);
            //转成json,设置contentType
            response.setContentType("application/json;charset=utf-8");
        }
    
    
    }
    

    用户审核,的总体代码:参考Day18 有代码汇总

    展开全文
  • 使用连接扫描算法以C ++编写的公交路由服务器应用程序,其中包括灵活的参数。 表现 具有随机的出发地和目的地(出发地和目的地有多个可到达的站点):大约150毫秒用于出入小径计算,大约8毫秒用于CSA双向计算(已...
  • Django Urls路由

    2019-04-04 00:33:00
     路由是Web服务的入口,就好像办事大厅有各个服务窗口一样Django奉行DRY主义,提倡使用简洁、优雅的URL:可以不用 .html 、 .php 或 .cgi 之类后缀。尽量不要单独使用无序随机数字这样无意义的东西,让你随心所欲...
    • 路由层

      路由是Web服务的入口,就好像办事大厅有各个服务窗口一样Django奉行DRY主义,提倡使用简洁、优雅的URL:可以不用 .html 、 .php 或 .cgi 之类后缀。尽量不要单独使用无序随机数字这样无意义的东西,让你随心所欲设计你的URL,不受框架束缚。

    • 路由
      • urlpatterns

            urlpatterns是路由文件中的一个全局变量,用来存放路由及视图函数的映射关系。用户发起的请求URL都会首先进入主控制目录下的这个urls.py文件中进行查找匹配。

            

            1. 首先找到urls.py下的urlpatterns全局变量,这是一个路由规则实例的列表数据。

            2. 按照先后定义顺序,进行路由匹配。

            3. 找到第一个匹配项时停止匹配,执行匹配到的视图函数。

            4. 遍历完全,未发现匹配,django进行异常处理。

     

            其中urlpatterns中的每一个路由映射规则可以由path或re_path进行构造。

            注意:Django的路由不考虑HTTP请求方式,仅根据URL进行路由;即,只要URL相同,无论POST、GET等哪种请求方式都指向同一个操作函数

      • path
    path(regex, view, kwargs=None, name=None)
    参数介绍:
    regex:一个匹配对应url地址的规则字符串。
    view:路由对应的视图函数,并且会自动封装HttpRequest作为第一个参数给这个视图函数。
    kwargs:视图函数的关键字参数。
    name:该路由的全局命名,可以让我们方便的在django项目中任意部分显示的使用,相当于为url取变量名,接下来全局使
    用该命名值即可;当对应url路由改变之后,不需要把使用的地方也修改。

            此外,django还提供了一个兼容老版本url路由配置函数的re_path函数;
            re_path:第一个参数部分为一个正则匹配规则,其他与path同

      • 静态路由

            静态路由用来映射对应视图函数,以下是一个简单的例子

    from django.http import HttpResponse
    def index(request):
            return HttpResponse('Hello Worlds!')
    from django.urls import path,re_path
    from urlapp import views
    urlpatterns = [
            path('',views.index),
            re_path(r"^",views.index),
    ]
    • 路由传参

        有的时候,我们的路由设置不能一直维持一个一成不变的状态;比如遇到一些内容翻页的场景,那么我们的连接可能是:xx.com/airticle_list/1/、xx.com/airticle_list/2/

        那么这样的路由其实对应的都应该是一个视图函数,用以展示页面内容,那么如何设计这样的路由,就要涉及到动态路由及路由传参。

    def index(request,x,y):
         content = "x:%s\ny:%s" % (x,y)
         return HttpResponse(content)

        定义如上函数,将会接收连接中的后两部份path值作为参数,分别依次给到x和y

    from django.urls import path,re_path
    from urlapp import views
    urlpatterns = [
            path('<int:x>/<str:y>/',views.index),
            #指明类型
            path("<x>/<y>/",views.index)
            #不指明类型
            re_path(r"^(?P<x>\d+)/(?P<y>[a-zA-Z]+)/$"),
            # (?P<name>pattern) 正则分组
            re_path(r"^(\d+)/([a-zA-Z]+)/$"),
    ]

        路由通过尖括号进行分组匹配,使用int以及str内置转换器将连接对应部分的值进行转换;并将匹配到的结果传递到视图函数对应的参数位置上;

      访问:http://127.0.0.1:8000/1/abc/
      其中1将作为x的参数值, abc 将作为y的参数,但如果访问连是:http://127.0.0.1:8000/abc/abc/,这会匹配到第二个路由,第二个路由没有对传递参数的类型进行限定

      • 内置Path转换器:
    str:匹配除了路径分隔符(`/`)之外的非空字符串,这是默认的形式
    int:匹配正整数,包含0
    slug:匹配字母、数字以及横杠、下划线组成的字符串
    uuid:匹配格式化的uuid,如 075194d3-6885-417e-a8a8-6c931e272f00
    path:匹配任何非空字符串,包含了路径分隔符
        • 自定义转换器

                除了以上django所提供的path转换器,如果还觉得无法实现我们想要的功能,我们可以通过编写一个类进行自定义path转换器

    1: 定义转换器类,类名随意
    2: 定义类中必须属性:
        •regex:一个字符串形式的正则表达式,也是对应的路由规则
        •to_python(self, value):用于将匹配到的路由字符串转换为Python中的数据类型,并传递给视图函数
        **如果转换失败,必须抛出ValueError**
        •to_url(self, value):将Python数据类型转换为一段url的方法,to_python方法的反向操作
    3: 通过django.urls模块中的register_converter函数进行注册
        •函数第一个参数为转换器类
        •函数第二个参数为转换器别名

                以下定义一个只允许三位字符的路由位置参数:

    #先将转换器类定义
    class ThreeChar:
         regex = "[a-zA-Z]{3}"
         def to_python(self,value):
              print("to_python")
              return str(value)
         def to_url(self,value):
               # 当通过反向路由解析时,将会调用该函数
               print('to_url')
               return str(value)[:3]
              #此处切片操作是为了当反向路由解析传参字符串长于3时,可以将其截断,符合转换器正则规则
    #注册转换器
    from django.urls import register_converter
    register_converter(ThreeChar,'tc')
    urlpatterns = [
          path('<tc:x>/<tc:y>/',views.index)
    ]
    #127.0.0.1:8000/aaa/bbb/

                接下来,通过路由进行访问该视图映射时,一定是三个字符所组成的路由才可以,否则是访问不到的。

    #urls.py
    app_name = "app"
    path('<tc:x>/<tc:y>/',views.index, name="threechr")
    
    #views.py
    return redirect(reverse("app:threechr",args=('aaaa','bbbb')))
    #此时会调用three路由规则中的tc转换器中的to_url反向合成路由,并切片只取参数前三位
      • 路由分发

            我们的路由编写都是在项目主要目录下的urls.py文件中,但是如果app有很多的话,这么多路由都写到一起,明显是一件很不方便管理的事情。

            其实在之前的练习中,我们使用的方式均是路由分发,每个子app都拥有自己独立的urls.py路由映射文件,而主控路由文件里只需要使用include函数导入子app下路由文件即可,这就是路由分发。

    from django.contrib import admin
    from django.urls import path,include
    urlpatterns = [
          path('admin/', admin.site.urls),
          path('',include("urlapp.urls")) # 使用include 实现路由分发,找到子app下的路由文件
    ]

             路由分发为我们带来的好处有很多,可以让我们在多个app的项目中更加方便有效的管理每一个路由,并且也可以让我们的用户在访问时看到浏览器中的URL地址更加赏心悦目。

    • 路由反向解析

          到了这里,思考一下,之前我们已经设置过了很多路由;
          但是现在会出现一个问题,比如我们把其中某个路由规则进行了修改,把aaa换成了aba,那么现在我们需要回到每一个使用到这个路由的地方进行同步修改,这显然非常麻烦的,如果修改的路由更多,这甚至是一个灾难!

          django也为我们提供了一个解决办法,通过为路由映射使用name参数,来为每一个路由映射设置一个独立唯一的变量名。

    path('left/<str:x>/',views.left, name="left"),
    path('right/<int:x>/',views.right, name="right"),
    # 通过正则命名分组方式
    re_path(r'^left/([a-zA-Z]+)/$',views.left,name="left"),
    re_path(r'^right/(?P<x>\d+)/$',views.right, name="right")
        • 两个视图函数对应如下:
    def left(request,x):
        # x: str
        content = {
            'message':x,
        }
        return render(request, "left.html", content)
    
    def right(request,x):
        # x: int
        content = {
            'message':x,
        }
        return render(request, "right.html",content)
        • 两个HTML页面
    <p>我是左页面</p>
    <p>路由参数: {{ message }}</p>
    <a href="{% url 'right' 123 %}">右页面</a>
    <!-- ------另一个页面------ -->
    <p>我是右页面</p>
    <p>路由参数: {{ message }}</p>
    <a href="{% url 'left' 'abc' %}">右页面</a>

                在模板页面中,对于已命名路由可以通过 {% url "name" "arg" %} 模板标签进行反向解析。

                参数以空格隔开,在标签后传入。

        • 视图函数反向解析
    def index(request):
            return redirect(reverse("left",args=('aaa',) ))

                在视图函数中需要使用到路由命名时,进行反向解析需要我们通过django.shortcuts模块下的reverse函数

    reverse(viewname,args=None,kwargs=None)
    参数介绍
    viewname:视图函数、命名路由映射、或视图函数路径的字符串
    args:元组形式路由传参。
    kwargs:字典形式路由传参
    • 命名空间

          如果想在多个app下使用相同的name路由命名,那么我们可以通过路由分发过程中的include函数来指定不同app所属的命名空间。

    from django.contrib import admin
    from django.urls import path,include
    urlpatterns = [
         path('admin/', admin.site.urls),
         path('app1/',include(("app1.urls",'app1'))),
            #直接传递一个元祖,元祖第一个值为分发路由地址,第二个值为命名空间    
         path('app2/',include(("app2.urls",'app2')))
    ]      

          当为每个 app 的路由分发映射设置了命名空间,接下来在模板页面以及视图函数对路由的反向解析将是如下所示的样子,路由解析前加冒号指明命名空间。

    def index(request):
        return redirect(reverse("app1:left"))
    <a href="{% url 'app2:left' %}">app2:left</a>
      • 应用命名空间:app_name

            使用 app_name 指明命名空间,在子app的urls.py文件下配置全局变量app_name,这个值是唯一的在这个路由文件中定义的其他映射关系,将具有命名空间app1:

    app_name = "app1" # 这个值应该是唯一的
    urlpatterns = [
            ...
    ]
      • 实例命名空间:namespace

             当有多个子app同时引入一个子路由映射文件,比如这样:

    from django.contrib import admin
    from django.urls import path,include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('app1/',include("app1.urls")),
        path('app2/',include("app1.urls")),
    ]

            这就会出现一个问题,不同的路由访问在做路由反向解析时,会造成混淆,所以我们需要给每一个路由分发的规则设置namespace属性,为实例进行命名空间。

     

    from django.contrib import admin
    from django.urls import path,include
    
    urlpatterns = [
        path('admin/', admin.site.urls),
        path('app1/',include("app1.urls",namespace="app1")),
        path('app2/',include("app1.urls",namespace="app2")),
    ]

            这样做的好处,可以在不同路由导向同一app下时,为他们的不同命名空间;
            虽然看起来到最后执行的视图函数功能是一样的,但可以分清楚究竟是哪个路由引起视图函数在工作,接下来视图及模板页面中使用namespace的值。

     

    <p>我是左页面</p>
    <p>路由参数: {{ message }}</p>
    <a href="{% url 'app1:right' 123 %}">app1的右页面</a>
    <p>我是右页面</p>
    <p>路由参数: {{ message }}</p>
    <a href="{% url 'app1:left' 'abc' %}">app1的左页面</a>
    <!-- ----------------------------------------- -->
    <p>我是左页面</p>
    <p>路由参数: {{ message }}</p>
    <a href="{% url 'app2:right' 123 %}">app2的右页面</a>
    <p>我是右页面</p>
    <p>路由参数: {{ message }}</p>
    <a href="{% url 'app2:left' 'abc' %}">app2的左页面</a>

     

     

     

     

    转载于:https://www.cnblogs.com/onerose/p/10652604.html

    展开全文
  • springcloudgateway...权重路由可将客户请求按设置的比例随机分发给后端的服务器 ************************** 示例 配置文件 spring: cloud: gateway: routes: - id: custom_route uri: http://www...
  • 网关和路由介绍?

    2020-09-21 11:44:01
    网关: 请求时作为限制,筛选,控制的一个层级,它通常用于web层。...你在前面给我一个请求,你要访问哪一个方法,哪一个类,我直接给你路由到指定服务节点上。 负载均衡,轮询,侧重,hash一致性,随机
  • 使用istio我们可以根据权重和HTTP headers来动态配置请求路由。... 这是因为没有明确的默认版本集,Istio将以随机方式将请求路由服务的所有可用版本。 注意:假定您尚未设置任何路由。如果您已经为示例创建了...
  • 现在就开始讲解xxl-job的核心路由策略算法,总共有10种路由策略,对于以后想从事分布式微服务开发,任务调度的学习是很有必要的。 2.路由策略种类 第一个 最后一个 随机选取 轮询选取 一致性hash 最不经常...
  • 对于单机用户来说,ADSL接入方式的安装配置都比较简单,大多使用PPPOE虚拟拨号方式,通过抓取随机的IP地址上网。对于家中有多台电脑需共享上网的用户来说,一般可通过建立和配置代理服务器来实现共享上网,缺点是...
  • 针对低轨(LEO,low earth orbit)卫星网络中,链路资源利用不均衡以及差异化业务的服务质量(QoS,quality of service)要求难以满足,容易导致网络整体运行效率降低的问题,提出了一种基于多目标决策的路由算法。...
  • Linux 双线路由设置

    2010-07-04 00:13:32
    公司是双线,一条是固定IP(假设IP为192.168.2.1),另外一条线路是个人ADSL(IP联通随机分配的)。 要求:1.公司员工上网的时候只能通过个人ADSL线路上网,设置网关为192.168.1.1. 2.公司开发部门的员工登录公司...
  • 上章内容只是简单运行了Bookinfo示例(Istio使用【Bookinfo示例】),访问页面,Reviews虽然有三个版本,但是刷新浏览器,三个版本是随机返回。本章内容仍然使用官方样例配置,定义一些自定义路由规则。在这之前最好...
  • 简而言之:我想声明一个自定义路由事件,同时从声明它的同一个用户控件中监听它.我想要实现的是拥有一个为某个任务提供请求的用户控件,所以我想到了这个场景:&...树中的用户控件实例为请求提供服务.它似乎不起作用....
  • 3.1静态路由与默认路由 45 3.1.1 静态路由介绍 45 3.1.2 默认路由介绍 47 3.1.3 ip classless 47 3.2 实验1:静态路由 48 3.3 实验2:默认路由 52 3.3 实验3:ip classless 53 3.5静态路由命令汇总 54 第4章 RIP 55 ...
  • 路由为两台电脑分配了相同的IP!!

    千次阅读 2010-07-12 08:47:00
    在配置的过程中发现居然两台电脑的IP相同,由同一个路由随机分配的。顿时一头雾水。 打开路由配置界面,发现路由的连接状态就有一台电脑。突然想起来,我的两台电脑的MAC地址曾经被改成一样的了。 原来如此,相同的...
  • TFTP (普通文件传输协议或一般文件传输协议) 大家一定记得在2003年8月12日全球爆发冲击波(Worm.Blaster)病毒,这种病毒会监听端口69,模拟出一个TFTP服务器,并启动一个***传播线程,不断地随机生成***地址,进行***...
  • dubbo服务治理

    2019-09-23 14:17:20
    目录 1. 服务治理简介 2. 服务治理的原理 2.1 Cluster 2.2Directory (默认RegistryDirectory) 2.3 Router(默认规则 ...2) 路由 (标签路由和条件路由) 3) 负载均衡 (随机,轮询,一致性哈希,最低负...
  • 1、功能特性 特性名 ... 服务订阅发布 ... 配置化发布和引用服务 ... 支持通过xml配置的方式发布和导入服务 ... 服务自动发现机制 ... 支持服务实时自动发现,由注册... 默认提供随机路由、轮询、基于权重的策略等 ...
  • 20190109 目录 1.1.spring cloud-zuul的网关详解 1.1.1.网关的相关设置 1.1.1.1....1.1.1.2....1.1.1.3....拓展三:服务路由的默认规则 拓展四:特殊场景 注意:cookie与头信息 1.学到的知识 1.1.spring clo...
  • 一、权重算法权重算法一般在路由里面用的比较多,分布式环境下对等的服务有多个,加权随机选出一个服务来调用;可能还有其他方面的用途,下面的代码简单的实现了这个权重,本质上就用到了数组,随机下标;二、代码...
  • 前段时间抓一个网站的数据,呵呵,这个网站就不说了,反正也是蛮出名的一家公司,然后数据还是挺干净的,呵呵,我让抓得很爽啊。...后来又尝试换成随机代理的方式去拽数据,但也不行,因为代理是透明...
  • 基于nodejs+zookeeper服务发现

    千次阅读 2017-08-10 11:08:30
    本文使用nodejs作为微服务API网关,从而将消费端的请求,随机路由到一个可用的服务节点上。
  • Dnrd 服务器搭建

    2019-05-06 13:51:38
    DNRD是什么 DNRD是一种缓存,转发... 使用随机源端口和随机查询ID来防止缓存中毒。 支持简单路由 - 为不同的域指定不同的转发DNS服务器。 强制指定域的授权或非口头答案。 通过网络共享/ etc / hosts。 支持op...
  • Dubbo分布式服务

    2018-07-12 20:51:55
    Dubbo分布式服务 1.Dubbo是一个分布式服务框架,致力于提供高性能和透明化的远程服务调用方案,这容易和负载均衡弄混,负载均衡是对外提供一个公共地址,请求过来时通过轮询、随机等,路由到不同server。...
  • 该算法使用非线性动态变化的伪随机比例选择参数及蚂蚁多重最优解随机加权路由选择算法控制蚁群的行为,使用5维Web服务质量向量和蚁群适应度函数评价蚂蚁构造的路径质量,蚂蚁根据其构造的路径质量进行信息素更新;...

空空如也

空空如也

1 2 3 4 5 ... 10
收藏数 188
精华内容 75
关键字:

服务随机路由