文章目录

  • 1、控制器介绍
  • 2、环境介绍
    • 2.1 硬件环境
    • 2.2 拓扑介绍
  • 3、安装控制器
    • 3.1 安装JDK环境
    • 3.2 安装Maven环境
    • 3.3 安装OpenDayLight
      • (1)拷贝软件包到系统内,执行以下命令完成解压
      • (2)进入目录准备安装
      • (3)修改mvn的配置setting位置路径
      • (4)启动OpenDayLight服务进程
      • (5)开始以客户端方式连接
  • 4、配置OpenStack
    • 4.1 清除Neutron配置内容
    • 4.2 清除Neutron相关内容
    • 4.3 清除OVS数据库数据
    • 4.4 配置OpenvSwitch
  • 5、使用ODL
    • 5.1 访问Dashboard界面
    • 5.2 测试

1、控制器介绍

OpenDayLight是2013推出来的一个开源项目,参与者都是来自众多的设备厂商,其中就包括思科等网络设备巨头,IBM、微软等传统的硬件设备巨头,还包括BigSwitch等新兴网络设备厂商,以及Vmware等新兴IT软件厂商,这就说明SDN领域为业界的发展带来了更多的机会,是更多的参与者能够加入到SDN的研发和创新中;OpenDayLight开源项目就是和Linux基金会合作,目标是成为SDN架构中的核心组件,使用户能够减少网络的运营复杂度,扩展现有的网络架构的硬件生命期,同时还能支持SDN新业务和新能力的创新。

所谓SDN是一种新型网络架构。传统网络采用是分布式策略工作, 由设备制定转发策略,而SDN的核心思想这是控制和转发分离,将软件应用到网络控制中,并起到主导作用,而不是固定的模式的协议控制网络,SDN的目的是提高网络的可控性与可编程性,可以根据用户需求灵活的提供不同的质量等级服务。

2、环境介绍

2.1 硬件环境

系统最低要求: 2CPU 、4G内存

2.2 拓扑介绍

云平台具体安装拓扑如图:

搭建云平台搭建之前,首先配置好OpenDayLight的生产环境,安装完成之后,根据云计算基础架构平台的设计,在控制节点和计算节点完成相关模块的安装和配置,本次云平台的网络模式为Neutron Gre模式,同时Neutron的L3 agent服务和Neutron的DHCP均安装在Compute节点,如果需要采用OpenDayLight模式管理虚拟网络,那么需要在配置之前清空OpenvSwitch的相关配置,所以云实例的启动需要在完成OpenDayLight的前提下进行,具体的IP地址分配如下所示。

主机名 隧道(管理网段)地址 实例(外网)地址
Controller 30.0.0.10 192.168.100.10
Compute/Network 30.0.0.20 192.168.100.20
OpenDayLight 192.168.100.10

本次安装配置可以按照以下的步骤:

(1)在控制节点安装OpenDayLight控制软件,并完成控制器的配置。
(2)安装云计算平台,确定网络节点。
如果不确定网络节点可以通过neutron agent-list 查看,即存在DHCP和L3服务的节点为网络节点,以下网络节点的操作步骤在此节点进行。
(3)修改Ml2的插件的mechanism_ drivers类型
(4)清空OpenvSwitch的默认配置,交由OpenDayLight来监控。
(5)重新启动OpenvSwitch,正常完成Neutron的使用,Dashboard界面创建网络和云主机。

3、安装控制器

3.1 安装JDK环境

OpenDaylight的安装节点需要配置JDK的环境,安装提供的Java软件包jdk-7u71-linux-x64.tar.gz
首先拷贝软件包到系统中,然后执行以下命令安装。
[root@controller ~]# # tar -zxvf jdk-7u71-linux-x64.tar.gz -C /usr/local/修改环境变量添加如下内容
编辑文件 /etc/profile
export JAVA_HOME=/usr/local/jdk1.7.0_71/
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
安装完成执行以下命令检测安装。执行环境变量
[root@controller ~]# source /etc/profile
[root@controller ~]# java -version
java version "1.7.0_71"
Java(TM) SE Runtime Environment (build 1.7.0_71-b14)
Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)

3.2 安装Maven环境

OpenDaylight的安装节点需要配置Maven的环境,安装提供的Maven软件包apache-maven-3.0.4.tar.gz
[root@controller ~]# tar -zxvf apache-maven-3.0.4.tar.gz  -C /usr/local/修改环境变量添加如下内容
编辑文件 /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-3.0.4/
export PATH=${PATH}:${MAVEN_HOME}/bin
安装完成执行以下命令检测安装。执行环境变量
[root@controller ~]# source /etc/profile
[root@controller ~]# mvn -v
Apache Maven 3.0.4 (r1232337; 2012-01-17 16:44:56+0800)
Maven home: /usr/local/apache-maven-3.0.4
Java version: 1.7.0_71, vendor: Oracle Corporation
Java home: /usr/local/jdk1.7.0_71/jre
Default locale: zh_CN, platform encoding: UTF-8
OS name: "linux", version: "3.10.0-327.36.2.el7.x86_64", arch: "amd64", family: "unix"

3.3 安装OpenDayLight

(1)拷贝软件包到系统内,执行以下命令完成解压

将软件包解压到指定的目录下(目录需存在)
# tar -zxvf opendaylight.tar.gz -C /opt

(2)进入目录准备安装

# cd /opt/opendaylight/

(3)修改mvn的配置setting位置路径

编辑以下配置文件
vi +37 etc/org.ops4j.pax.url.mvn.cfg
将此段修改成
org.ops4j.pax.url.mvn.settings=/usr/local/apache-maven-3.0.4/conf/settings.xml

(4)启动OpenDayLight服务进程

# ./bin/start
确保存在进程后执行以下步骤,即确定 ps aux |grep opendaylight 存在进程。

(5)开始以客户端方式连接

需要在启动进程之后等待一段,否则会出现以下报错
Failed to get the session.

# ssh -p 8101 karaf@localhost

密码为karaf
登录成功如下图所示,此时我们继续配置OpenDayLight模块内容

Logging in as karaf

此时我们执行以下命令完成模块的安装
opendaylight-user@root> feature:install odl-ovsdb-openstack odl-dlux-core

通过以上命令我们可以安装OpenDayLight一个最基本的框架,目前只支持我们可以通过web界面简单的查看Neutron的分配情况,包括OpenvSwitch的网桥的分配的虚拟接口情况。

OpenDayLight提供的安装命令为feature:install然后加上安装的需要插件, odl-ovsdb-openstack为安装基于OpenvSwitch的的OpenStack功能, odl-dlux-core为安装DLUX功能,管理界面。

此时我们打开web界面均可以访问OpenDayLight界面。
打开方式http://主机IP:8181/index.html
默认用户名和密码均为admin。

至此,OpenDayLight环境安装完毕,下面开始配置OpenStack的Neutron服务和OpenvSwitch服务。

4、配置OpenStack

4.1 清除Neutron配置内容

由于是使用OpenDayLight来管理网络,所以节点的ovs-agent服务已经失去了意义,
Neutron的相关API接口都是通过Neutron-Server来管理和处理,从而使用适合的驱动。
那么在SDN的模式下,我们将Neutron的所有的请求都是转发给ODL来处理,ODL也是有着多种虚拟网络管理方式(OVSDB),
在使用OVSDB之前我们需要在Neutron—server节点安装networking-odl软件包如下面所示。
networking-odl.tar.gz[root@controller ~]# tar -zxvf networking-odl.tar.gz
[root@controller ~]# cd networking-odl
[root@controller networking-odl]# python setup.py install

4.2 清除Neutron相关内容

我们需要确保OpenStack网络状态是没有配置的,当使用OpenDaylight作为Neutron的后端时,,ODL开始接管Open vSwitch的配置。因此,有必要删除现有的OpenStack和OpenvSwitch配置。
通过以下命令删除相关内容。
(1)移除实例
通过命令或者Dashboard界面完成
# nova list
# nova delete <name /id >(2)移除子路由器上子网接口
通过命令或者Dashboard界面完成
# neutron subnet-list
# neutron router-list
# neutron router-port-list <router name>
# neutron router-interface-delete <router name> <subnet ID or name>(3)移除网络子网、网络、路由器
# neutron subnet-delete <subnet name>
# neutron net-list
# neutron net-delete <net name>
# neutron router-delete <router name>(4)停止Neutron-server服务
[root@controller ~]# systemctl stop neutron-server.service (5)停止OvS-agent
所有节点停止Neutron-OpenvSwitch-agent服务,并将开机自启关闭。
[root@controller ~]# systemctl stop neutron-openvswitch-agent.service
[root@controller ~]# systemctl disable neutron-openvswitch-agent.service(6)节点停止服务
# systemctl stop  neutron-metadata-agent.service(所有节点)
# systemctl stop  neutron-dhcp-agent.service (网络节点)
# systemctl stop  neutron-l3-agent.service(网络节点)
# systemctl stop  neutron-lbaas-agent.service(网络节点)(7)删除Neutron数据库
[root@controller ~]# mysql -uroot -p000000(数据库密码为000000)
mysql> drop database neutron;
mysql> create database neutron ;
mysql> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'localhost' IDENTIFIED BY '000000';
mysql> GRANT ALL PRIVILEGES ON neutron.* TO 'neutron'@'%' IDENTIFIED BY '000000';
mysql> exit(8)同步数据库
# su -s /bin/sh -c "neutron-db-manage --config-file /etc/neutron/neutron.conf   --config-file /etc/neutron/plugins/ml2/ml2_conf.ini upgrade head" neutron
# neutron-db-manage --service lbaas upgrade head
# neutron-db-manage --subproject neutron-fwaas upgrade head

4.3 清除OVS数据库数据

(1)配置OpenDaylight管理Open vSwitch
在每个节点上清除已有的Open vSwitch配置。
# systemctl stop  openvswitch.service
# rm -rfv /var/log/openvswitch/*
# rm -rfv /etc/openvswitch/conf.db
# systemctl start  openvswitch.service(2)查看OVS数据
[root@controller ~]# ovs-vsctl show
890ef6b7-8f58-41f3-a0cc-7591ddf1bb7bovs_version: "2.5.0"(3)配置Neutron ml2 Plugin
修改两个节点的/etc/neutron/plugins/ml2/ml2_conf.ini配置文件,修改如下
mechanism_drivers = opendaylight(4)添加ODL控制到ml2配置文件中
在两个节点的/etc/neutron/plugins/ml2/ml2_conf.ini配置文件最后添加如下内容
[ml2_odl]
password = admin
username = admin
url = http://30.0.0.10:9090/controller/nb/v2/neutron(5)配置Gre模式
控制节点、计算/网络节点
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 type_drivers gre
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2 tenant_network_types gre
openstack-config --set /etc/neutron/plugins/ml2/ml2_conf.ini ml2_type_gre tunnel_id_ranges  1:1000openstack-config --set /etc/neutron/plugins/ml2/openvswitch_agent.ini agent tunnel_types  gre
openstack-config --set /etc/neutron/plugins/ml2/openvswitch_agent.ini ovs local_ip 30.0.0.10/30.0.0.20 (实际隧道地址)
openstack-config --set /etc/neutron/plugins/ml2/openvswitch_agent.ini ovs enable_tunneling  True

4.4 配置OpenvSwitch

(1)配置OpenvSwitch local_ip
控制节点
# ovs-vsctl set Open_vSwitch c11a6e0a-761a-471f-a2a2-3c4ad1835c46 other_config={'local_ip'='30.0.0.10'}
计算节点
# ovs-vsctl set Open_vSwitch ac83d579-5891-4fc5-bad6-69a20b151728 other_config={'local_ip'='30.0.0.20'}
注:ID为OpenvSwitch的ID,通过命令ovs-vsctl show查询(2)配置完毕后可以通过以下命令查看Open_vSwitch的详细信息
# ovs-vsctl list Open_vSwitch
控制节点
[root@controller ~]# ovs-vsctl list Open_vSwitch
_uuid               : c11a6e0a-761a-471f-a2a2-3c4ad1835c46
bridges             : []
cur_cfg             : 1
db_version          : "7.4.0"
external_ids        : {system-id="d9e75022-cf94-4096-b8ed-2f8bc9459858"}
manager_options     : [8625e292-1a5f-4c61-a853-52ff3573c29f]
next_cfg            : 77
other_config        : {local_ip="30.0.0.10"}
ovs_version         : "2.1.3"
ssl                 : []
statistics          : {}
system_type         : CentOS
system_version      : "6.5-Final"计算/网络节点
[root@compute ~]# ovs-vsctl list Open_vSwitch
_uuid               : ac83d579-5891-4fc5-bad6-69a20b151728
bridges             :[]
cur_cfg             : 1
db_version          : "7.4.0"
external_ids        : {system-id="235037e4-ee77-4cc8-a9de-28068f6cada7"}
manager_options     : [b0f89092-d52b-4e32-9786-37d5bf348de1]
next_cfg            : 41
other_config        : {local_ip="30.0.0.20"}
ovs_version         : "2.1.3"
ssl                 : []
statistics          : {}
system_type         : CentOS
system_version      : "6.5-Final"(3)设置所有节点的OpenvSwitch对应的SDN控制器OpenDayLight
每个节点# ovs-vsctl set-manager tcp:30.0.0.10:6640
执行完命令之后通过查看ovs的状态,可以看出br-int网桥已经创建成功
[root@controller ~]# ovs-vsctl show
c11a6e0a-761a-471f-a2a2-3c4ad1835c46Manager "tcp:30.0.0.10:6640"is_connected: trueBridge br-intController "tcp:30.0.0.10:6633"is_connected: truefail_mode: securePort br-intInterface br-int
ovs_version: "2.1.3"查看OVS的br-int端口的状态
[root@controller ~]# ovs-ofctl dump-ports-desc br-int -OopenFlow13
OFPST_PORT_DESC reply (OF1.3) (xid=0x2):LOCAL(br-int): addr:8a:8c:e5:f0:3d:4aconfig:     PORT_DOWNstate:      LINK_DOWNspeed: 0 Mbps now, 0 Mbps max查看br-int的流规则
[root@controller ~]# ovs-ofctl dump-flows br-int -OopenFlow13
OFPST_FLOW reply (OF1.3) (xid=0x2):cookie=0x0, duration=4902.037s, table=0, n_packets=0, n_bytes=0, send_flow_rem dl_type=0x88cc actions=CONTROLLER:65535cookie=0x0, duration=4901.183s, table=0, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=goto_table:20cookie=0x0, duration=4900.681s, table=20, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=goto_table:30cookie=0x0, duration=4900.177s, table=30, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=goto_table:40cookie=0x0, duration=4899.675s, table=40, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=goto_table:50cookie=0x0, duration=4899.170s, table=50, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=goto_table:60cookie=0x0, duration=4898.664s, table=60, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=goto_table:70cookie=0x0, duration=4898.159s, table=70, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=goto_table:80cookie=0x0, duration=4897.655s, table=80, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=goto_table:90cookie=0x0, duration=4897.150s, table=90, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=goto_table:100cookie=0x0, duration=4896.645s, table=100, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=goto_table:110cookie=0x0, duration=4896.130s, table=110, n_packets=0, n_bytes=0, send_flow_rem priority=0 actions=drop(4)节点配置br-ex
# ovs-vsctl add-br br-ex
# ovs-vsctl add-port br-ex eth1(5)启动Neutron-server服务
# systemctl start  neutron-server.service(网络节点)(6)启动服务
# systemctl start  neutron-metadata-agent.service(所有节点)
# systemctl start  neutron-dhcp-agent.service (网络节点)
# systemctl start  neutron-l3-agent.service(网络节点)
# systemctl start  neutron-lbaas-agent.service(网络节点)(7)检查OpenDayLight
通过curl命令检查返回状态
[root@controller ~]# curl -u admin:admin http:// 30.0.0.10:9090/controller/nb/v2/neutron/networks
{"networks" : [ ]
查看返回结果,显示如上所示为正常。

5、使用ODL

5.1 访问Dashboard界面

创建Neutron的网络,创建子网和路由器

5.2 测试

我们在openstack controller节点查询 ovs的简单信息可以看出由opendaylight管理的网络流量如下:

[root@controller ~]# ovs-vsctl show
09274dec-f169-48c5-98cb-3dcce1a04372Manager "tcp:172.24.13.10:6640"is_connected: trueBridge br-intController "tcp:172.24.13.10:6653"is_connected: truefail_mode: securePort "tape717856b-ec"Interface "tape717856b-ec"type: internalPort "tapa960c4a0-93"Interface "tapa960c4a0-93"type: internalPort br-intInterface br-inttype: internalPort "gre-172.24.13.20"Interface "gre-172.24.13.20"type: greoptions: {key=flow, local_ip="172.24.13.10", remote_ip="172.24.13.20"}Port "qr-448244f7-6e"Interface "qr-448244f7-6e"type: internalBridge br-exPort "enp10s0"Interface "enp10s0"Port "qg-e0566534-8d"Interface "qg-e0566534-8d"type: internalPort br-exInterface br-extype: internalovs_version: "2.5.0"我们可以通过在OpenDayLight终端命令可以查询网络情况
[root@controller ~]# curl -u admin:admin http://30.0.0.10:9090/controller/nb/v2/neutron/networks
{"networks" : [ {"id" : "e6d49962-ac82-472e-8334-d6e3cd1ebb85","name" : "ext","admin_state_up" : true,"shared" : false,"tenant_id" : "66f53f0adfdb49e2b47d87357f49441e","router:external" : true,"provider:network_type" : "gre","provider:segmentation_id" : "1","status" : "ACTIVE","subnets" : [ "187c6453-d3df-4d2e-a7eb-66a130ccd969" ]}, {"id" : "c90cf500-c822-42bf-a54c-d14d8e4d7a0c","name" : "ext","admin_state_up" : true,"shared" : false,"tenant_id" : "66f53f0adfdb49e2b47d87357f49441e","router:external" : true,"provider:network_type" : "gre","provider:segmentation_id" : "1","status" : "ACTIVE","subnets" : [ "d4f046a8-e8dd-491c-9b3a-7fad513436ea" ]}, {"id" : "0321d24c-c7f0-46d3-b249-aa16023ecc87","name" : "demo","admin_state_up" : true,"shared" : false,"tenant_id" : "66f53f0adfdb49e2b47d87357f49441e","router:external" : false,"provider:network_type" : "gre","provider:segmentation_id" : "2","status" : "ACTIVE","subnets" : [ "6a654cb0-24de-4428-99bd-ac0d42cef318" ]}, {"id" : "598f43d7-265c-4060-85dd-46c33e4b81f8","name" : "192.168.60.0/24","admin_state_up" : true,"shared" : false,"tenant_id" : "66f53f0adfdb49e2b47d87357f49441e","router:external" : true,"provider:network_type" : "gre","provider:segmentation_id" : "1","status" : "ACTIVE","subnets" : [ "ed93d0b0-715f-487a-b956-df5f4eb4f3e1" ]}, {"id" : "34d2a4b5-baee-4013-8997-61dbe338bb52","name" : "ext","admin_state_up" : true,"shared" : false,"tenant_id" : "66f53f0adfdb49e2b47d87357f49441e","router:external" : true,"provider:network_type" : "gre","provider:segmentation_id" : "1","status" : "ACTIVE","subnets" : [ "85bbf6b9-08db-483b-af73-55bf7b6e90df" ]}, {"id" : "76fcc8a9-601f-49ea-b2e8-885ab589f65a","name" : "ext","admin_state_up" : true,"shared" : false,"tenant_id" : "66f53f0adfdb49e2b47d87357f49441e","router:external" : true,"provider:network_type" : "gre","provider:segmentation_id" : "1","status" : "ACTIVE","subnets" : [ "bf8b654d-7bee-4452-a329-81a6053e7a43" ]}, {"id" : "b7f1848c-6cf8-4113-803a-87cf91f70336","name" : "admin","admin_state_up" : true,"shared" : false,"tenant_id" : "66f53f0adfdb49e2b47d87357f49441e","router:external" : true,"provider:network_type" : "gre","provider:segmentation_id" : "1","status" : "ACTIVE","subnets" : [ "970f7639-ae07-4677-b8ad-9da4e1e0d5df" ]} ]以上这就是我们简单的使用ODL的管理流量的功能来处理Neutron的网络分配情况的一个实验测试。

OpenStack集成SDN控制器相关推荐

  1. Openstack Neutron 集成 SDN控制器

    Neutron 集成SDN控制器   一.Neutron的组成元素 Neutron-server可以理解为一个专门用来接收Neutron REST API调用的服务器,然后负责将不同的REST API ...

  2. OpenStack与SDN控制器的集成

    1.OpenStack Neutron简介 Neutron添加了一层虚拟的网络服务让租户(用户)构建自己的虚拟网络.Neutron是对网络的虚拟化,该网络可以从一个地方移动到另一个地方,而不会影响现有 ...

  3. 为OpenStack而生的SDN控制器——OVN

    为什么OVN会出现? OpenvSwitch (OVS) 以其丰富的功能和相对优秀的性能,成为OpenStack中广泛使用的虚拟交换机.在内核部分合并进入Linux主干之后,Open Vswitch几 ...

  4. SDN控制器的北向接口

    SDN北向接口是连接SDN控制器和用户应用之间的重要纽带,决定了SDN的实际能力与价值,直接影响了整个SDN市场的发展方向. 北向接口概述 作为一种颠覆传统网络的新型网络架构,SDN凭借其快速提供网络 ...

  5. 资源收集流程为SDN控制器

    一.收集网络元资源信息. 控制通道建立后,控制器和应答器主动启动控制协议,控制协议如openflow等,经认证后建立控制协议. 接着,转发器将信息注册到控制器:接口资源,标签信息,VLAN资源等等.基 ...

  6. SDN控制器的资源收集过程—Vecloud

    1.网元资源信息收集 控制器和转发器的控制通道建立完成后,转发器主动向控制器发起控制协议连接,控制协议为openflow等协议,认证后建立. 接下来,转发器向控制器注册信息:接口资源.标签信息.VLA ...

  7. SDN控制器OpenDaylight简介—VeCloud

    2013年,Linux Foundation联合思科.Juniper和 Broadcom等多家网络设备商创立了开源项目 Open Daylight,它的发起者和赞助商多为设备厂商而非运营商等网络设备消 ...

  8. SDN控制器OpenDaylight简介

    发展历程 Open Daylight是一个高度可用.模块化.可扩展.支持多协议的控制器平台,可以作为SDN管理平面管理多厂商异构的SDN网络.它提供了一个模型驱动服务抽象层( MD-SAL),允许用户 ...

  9. 开源SDN控制器和商用SDN控制器一览

    以下是来自IT168收集的2014年可追寻到的开源SDN控制器和商用SDN控制器,此处转载以供大家知悉,更多控制器信息需要大家自己动手去查询和理解. 开源SDN控制器组织(随机排序,仅为了查看便利) ...

最新文章

  1. C#连接sqlserver数据库
  2. Java VisualVM插件地址
  3. 2021巨量引擎汽车直播行业研究报告
  4. 最长有效括号子串长度 c语言,LeetCode: Longest Valid Parentheses (求最长有效匹配括号子串的长度)...
  5. 监听器入门看这篇就够了
  6. Objective-C语法与Cocoa框架
  7. 风行网否认收购暴风TV 称双方纯属业务合作
  8. isalnum c语言函数
  9. 用js解析经json序列化后的C#的DateTime类型数据
  10. LeetCode # Array # Easy #118. Pascal's Triangle 119. Pascal's Triangle II
  11. “硬件极客”:树莓派Raspberrypi安装Kali Linux保姆教程(通过树莓派安装ARM Kali教程)
  12. Kotlin学习:标准函数(Standard.kt),run()、with()...
  13. You Only Watch Once(YOWO)
  14. 优动漫PAINT实现制图化繁为简的一波骚操作
  15. 期末C语言不挂科之选择题
  16. java 行政区划 三级_Java学习-056-Jsoup爬虫获取中国所有的三级行政区划数据
  17. Google Chrome自定义新标签页
  18. Postman变量的使用
  19. 关于netty的IllegalReferenceCountException refCnt: 0, decrement: 1
  20. 如何将日语在线翻译成中文

热门文章

  1. 顶呱呱:厦门6少年30秒洗劫小米专卖店
  2. 统计大写字母个数 C语言实现
  3. 企业应采用可收回金额与账面价值孰低的方法进行减值测试的有
  4. cf游戏服务器显示怪文,cf游戏服务器异常怎么解决方案
  5. 人到中年再苦再难,也不要做这3种工作,余生漫长,越老越吃苦
  6. 2020年终总结,可能是我人生收获最多的一年
  7. 【图像隐藏】基于DCT算法实现数字水印嵌入+检测+攻击含Matlab源码
  8. 像程序员一样思考之一
  9. AI真的会取代人类吗?当然不可能!
  10. photoshop制作html,用Photoshop制作好的网页模板再来用dreamweave制作出html的简单教程...