Supervisor-守护进程工具
1. 进程管理工具(Supervisor) 简介 Supervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisor… 阅读更多 »Supervisor-守护进程工具
1. 进程管理工具(Supervisor) 简介 Supervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisor… 阅读更多 »Supervisor-守护进程工具
1. VPP 接口文件 vpp同控制平面交互的定义接口位于目录vpp/src/vnet和vpp/src/plugins中的api文件;例如src/vnet/ip/ip_types.api文件中定义实例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 |
/* Hey Emacs use -*- mode: C -*- */ /* * Copyright (c) 2018 Cisco and/or its affiliates. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ option version = "3.0.0"; manual_print typedef u8 ip4_address[4]; manual_print typedef u8 ip6_address[16]; enum address_family : u8 { ADDRESS_IP4 = 0, ADDRESS_IP6, }; /** * @brief The location at which to apply a feature */ enum ip_feature_location: u8 { IP_API_FEATURE_INPUT = 0, IP_API_FEATURE_OUTPUT, IP_API_FEATURE_LOCAL, IP_API_FEATURE_PUNT, IP_API_FEATURE_DROP, }; /* ECN code points - RFC 3168 https://tools.ietf.org/html/rfc3168 */ enum ip_ecn : u8 { IP_API_ECN_NONE = 0, IP_API_ECN_ECT0 = 1, IP_API_ECN_ECT1 = 2, IP_API_ECN_CE = 3, }; /* DSCP code points - RFC 2474 https://tools.ietf.org/html/rfc2474 Values other than these RFC defined values are accepted. */ enum ip_dscp : u8 { IP_API_DSCP_CS0 = 0, IP_API_DSCP_CS1 = 8, IP_API_DSCP_AF11 = 10, IP_API_DSCP_AF12 = 12, IP_API_DSCP_AF13 = 14, IP_API_DSCP_CS2 = 16, IP_API_DSCP_AF21 = 18, IP_API_DSCP_AF22 = 20, IP_API_DSCP_AF23 = 22, IP_API_DSCP_CS3 = 24, IP_API_DSCP_AF31 = 26, IP_API_DSCP_AF32 = 28, IP_API_DSCP_AF33 = 30, IP_API_DSCP_CS4 = 32, IP_API_DSCP_AF41 = 34, IP_API_DSCP_AF42 = 36, IP_API_DSCP_AF43 = 38, IP_API_DSCP_CS5 = 40, IP_API_DSCP_EF = 46, IP_API_DSCP_CS6 = 48, IP_API_DSCP_CS7 = 50, }; enum ip_proto : u8 { IP_API_PROTO_HOPOPT = 0, IP_API_PROTO_ICMP = 1, IP_API_PROTO_IGMP = 2, IP_API_PROTO_TCP = 6, IP_API_PROTO_UDP = 17, IP_API_PROTO_GRE = 47, IP_API_PROTO_ESP = 50, IP_API_PROTO_AH = 51, IP_API_PROTO_ICMP6 = 58, IP_API_PROTO_EIGRP = 88, IP_API_PROTO_OSPF = 89, IP_API_PROTO_SCTP = 132, IP_API_PROTO_RESERVED = 255, }; union address_union { vl_api_ip4_address_t ip4; vl_api_ip6_address_t ip6; }; manual_print typedef address { vl_api_address_family_t af; vl_api_address_union_t un; }; manual_print typedef prefix { vl_api_address_t address; u8 len; }; typedef ip4_address_and_mask { vl_api_ip4_address_t addr; vl_api_ip4_address_t mask; }; typedef ip6_address_and_mask { vl_api_ip6_address_t addr; vl_api_ip6_address_t mask; }; typedef mprefix { vl_api_address_family_t af; u16 grp_address_length; vl_api_address_union_t grp_address; vl_api_address_union_t src_address; }; manual_print typedef ip6_prefix { vl_api_ip6_address_t address; u8 len; }; manual_print typedef ip4_prefix { vl_api_ip4_address_t address; u8 len; }; /** \brief * * The vl_api_[ip4|ip6]_address_with_prefix_t types are used as a type to denote * both an IP address and a prefix. I.e. in CIDR notation * '192.168.10.1/24' the address is 192.168.10.1 and the network * prefix is 192.168.10.0/24. * * If only an address is needed use: vl_api_address_t types and if * only a network prefix is needed (i.e. no hosts bits), then use the * vl_api_prefix_t types. * **/ manual_print typedef vl_api_prefix_t address_with_prefix; manual_print typedef vl_api_ip4_prefix_t ip4_address_with_prefix; manual_print typedef vl_api_ip6_prefix_t ip6_address_with_prefix; /** \brief A context for matching prefixes against. (Think ip prefix list.) The meaning (exact match / want subnets) of an unset matcher is left to the implementer. @param le - le mut be <= to prefix.len. Default: 255 (not set). @param ge - ge must be greater than le and <= max_size of prefix. Default: 255 (not set). */ typedef prefix_matcher { u8 le; /* [default=255] */ u8 ge; /* [default=255] */ }; |
2. VPP 接口帮助文档 生成其他类型的接口文件,需要… 阅读更多 »Vpp私有API协议入门
1. 安装Linux 1.1. 安装vsftpd
1 2 |
#启动ftp功能,用于远程传输 yum install vsftpd |
1.2. 配置vsftpd配置文件 vi /etc/vsftpd/vsftpd.conf =》禁止匿名访问: 将配置文件中anonymous_enable=YES “改为 “anonymous_enable=NO … 阅读更多 »快速搭建LNMP环境Linux+Nginx+Mysql+Php
1. 简介 Redis中为什么引入Lua脚本? Redis是高性能的key-value内存数据库,在部分场景下,是对关系数据库的良好补充。 Redis提供了非常丰富的指令集,官网上提供了200多个命令。但是某些特定领域,需要扩充若干指令原子性执行时,仅使用原生命令便无法完成。 Redis 为这样的用户场景提供了 lua 脚本支持… 阅读更多 »Redis使用Lua脚本(转载)
正常大家都这么问的,但是实际上应该是想问:kafka和redis queue有什么区别? 因为redis是一个基于内存的kv数据库,而kafka是分布式发布订阅消息系统。两者本身不是同样一个层次的东西。 redis中有一个queue的数据类型,用来做发布/订阅系统,这个就可以和kafka进行比较了哈。 1. 存储介质不同 red… 阅读更多 »发布订阅_kafka和redis的区别(转载)
1. 概述 随着互联网技术的不断发展,用户量的不断增加,越来越多的业务场景需要用到分布式系统。 分布式系统有一个著名的理论CAP,指在一个分布式系统中,最多只能同时满足下面三项中的两项: 一致性(Consistency):在分布式系统中的所有数据备份,在同一时刻是否同样的值(等同于所有节点访问同一份最新的数据副本) 可用性(Av… 阅读更多 »三种分布式锁的实现(转载)
分布式事务锁通常用在多台机器上运行的程序需要进行状态同步的场景下,例如转账业务、分布式的扫描限速场景等; 如果是一个进程里面的共享资源,比如一个全局变量,也就通过代码内的锁进行上锁操作 目前微服务,分布式计算等盛行,所以一个项目可能会在很多云服务器或容器(docker)上,每个进程都是系统级别的隔离,很多时候资源都是在其他机子上… 阅读更多 »Redis分布式锁-golang实现