ESP32 开发笔记(三)源码示例 21_WIFI_STA_TCP_Client 在站模式STA下实现TCP客户端_sta站点可以作为tcp客户端吗-程序员宅基地

技术标签: ESP32 HelloBug开发板教程  

开发板购买链接

https://item.taobao.com/item.htm?spm=a2oq0.12575281.0.0.50111deb2Ij1As&ft=t&id=626366733674

开发板简介
开发环境搭建 windows

ESP32例程为C语言开发,并非Python/Arduino/AT指令开发,基于ESP-IDF_V4.2框架库,采用纯C语言开发,开发工具为Visual Studio Code

Android(安卓)例程全部为原生Android开发,例程全部支持到SDK版本29  Android 10.0(Q) 开发工具为Andirod Studio 4.0

PC源码例程为Visual Studio 2013开发,C++语言,基于MFC

送的MQTT账号,仅用于同学们开发测试,大家不要用到实际产品上,不定期更换密码,会在QQ群公布


以下列出的例程源码均编写完成(不断增加中),开发教程正在编写
基础例程:
    0_Hello Bug (ESP_LOGX与printf)    工程模板/打印调试输出
    1_LED                                                    LED亮灭控制       
    2_LED_Task                                          使用任务方式控制LED
    3_LEDC_PWM                                      使用LEDC来控制LED实现呼吸灯效果
    4_ADC_LightR                                      使用ADC读取光敏电阻实现光照传感
    5_KEY_Short_Long                              按钮长按短按实现
    6_TouchPad_Interrupt                          电容触摸中断实现
    7_WS2812_RMT                                  使用RMT实现RGB_LED彩虹变色示例
    8_DHT11_RMT                                    使用RMT实现读取DHT11温湿度传感器
    9_SPI_SDCard                                    使用SPI总线实现TF卡文件系统示例
    10_IIC_ADXL345                                使用IIC总线实现读取ADXL345角度加速度传感器
    11_IIC_AT24C02                                 使用IIC总线实现小容量数据储存测试
    12_IR_Rev_RMT                                使用RMT实现红外遥控接收解码(NEC编码)
    13_IR_Send_RMT                              使用RMT实现红外数据发送(NEC编码)
    14_WIFI_Scan                                    附近WIFI信号扫描示例    
    15_WIFI_AP                                        创建软AP示例
    16_WIFI_AP_TCP_Server                  在软AP模式下实现TCP服务端
    17_WIFI_AP_TCP_Client                   在软AP模式下实现TCP客户端
    18_WIFI_AP_UDP                              在软AP模式下实现UDP通讯
    19_WIFI_STA                                      创建STA站模连接路由器
    20_WIFI_STA_TCP_Server                在站模式STA下实现TCP服务端
    21_WIFI_STA_TCP_Client                 在站模式STA下实现TCP客户端
    22_WIFI_STA_UDP                            在站模式STA下实现UDP通讯
    23_LCD_Test                                      LCD液晶触摸屏显示测试
    24_XPT2046_Touch_Test                   电阻触摸XPT2046驱动测试触摸校正
ESP32应用例程
    Bluetooth_RGBLight                          Android手机通过蓝牙控制RGB灯变色
    Bluetooth_Sensor                              Android手机通过蓝牙读取开发板姿态和温度湿度参数
    Bluetooth_Test                                   Android手机通过蓝牙与开发板通讯
    Encryption_MD5                                MD5加密
    Encryption_SHA1                              SHA1加密
    Encryption_SHA256                          SHA256加密
    EncryptionDecrypt_AES_CBC          AES_CBC加密
    EncryptionDecrypt_AES_ECB          AES_ECB加密
    ESP32_SmartConfig                         通过Android手机配置WIFI连网
    HTTP_GET_Request_Weather        HTTP Get请求天气预报
    JSON_Package                                创建JSON数据包
    JSON_Parsing                                  解析JSON数据包
    LCD JPEG_Effect                             解码JGEG图片特效显示
    MQTT                                                MQTT通讯测试
Android(安卓)工具源码
 
  ESP32_Bluetooth_Chat                   Android通过蓝牙与开发板通讯测试
    ESP32_Bluetooth_RGBLight           Android通过蓝牙控制开发板RGB灯
    ESP32_Bluetooth_Sensor               Android通过蓝牙读取开发板3D姿态和温度湿度数据
    ESP32_SmartConfig                       Android手机配置WIFI配网
    MQTT_Test                                     Android与开发板通过MQTT协议通讯
    TCP_Client                                     Android作为TCP客户端与开发板通讯 
    UDP_Client                                     Android通过UDP协议与开发板通讯
PC(Visual Studio 2013 C++ MFC)工具源码
    MQTT_调试助手                                 PC通过MQTT与开发板通讯
    TCP 调试助手                                     PC通过TCP服务器/客户端与开发板通讯
    UDP 调试助手                                     PC通过UDP与开发板通讯
LVGL源码   
    LVGL_Full_Test                                  LVGL官方例程(使用到了大分部控件)
    LVGL_Arc_Test                                  圆弧指示器通过触摸动态改变值
    LVGL_Bar_Test                                  通过动画方式动态演示Bar进度条的使用方法
    LVGL_Button_Test                             通过5种不同动态效果的按钮学习按钮的创建与使用
    LVGL_ButtonMatrix_Test                   创建一个计算器布局来演示矩阵按钮控件的使用
    LVGL_Calendar_Test                         日历控件的创建和使用
    LVGL_Canvas_Test                           透明画布和画一个圆角过渡色矩形并旋转角度学习画布的使用
    LVGL_Chart_Test                               通过创建三个不同风格的图表来学习图表控件的使用
    LVGL_Checkbox_Test                        学习复选框控件的创建和使用
    LVGL_ColorPicker_Test                     创建一个颜色选择器并动态显示当前颜色的RGB值
    LVGL_Container_Test                        在内容控件上动态创建三个文本标签学习内容控件的自适应布局
    LVGL_Drop_down_List_Test              创建三个不同类型的下拉选择控件
    LVGL_Gauge_Test                             创建一个动态仪表和静态多指针仪表
    LVGL_Image_Test                              通过四个滑动条控件控制图片颜色的变化来学习图像控件的使用
    LVGL_ImageButton_Test                  创建一个图片背景的图像按钮
    LVGL_Keyboard_Test                       通过一个文本输入框控件还学习键盘控件的调用关闭设置
    LVGL_Label_Test                              创建内容颜色可变,长文本滚动展示,带阴影3D效果三个标签控件
    LVGL_LED_Test                                创建三个LED,学习LED控件的调光,颜色,开关的设置
    LVGL_Line_Test                                通过二维数组创建一段折线来演示线控件的使用
    LVGL_LineMeter_Test                      创建两个不同的线段弧形指示器动态展示数据
    LVGL_List_Test                                 创建一个带图标的列表控件
    LVGL_MessageBox_Test                  创建一个带按钮的消息框控件
    LVGL_ObjectMask_Test                    创建一个变幻色的文本学习蒙版遮罩效果
    LVGL_Page_Test                            学习页面控件的使用
    LVGL_Roller_Test                           通过示例学习滑动列表选择器控件
    LVGL_Slider_Test                           创建一个单向和一个双向滑动条控件
    LVGL_Spinbox_Test                        学习微调控件的使用
    LVGL_Spinner_Test                        创建三个不同的环形加载器
    LVGL_Switch_Test                          创建两个不同的开关控件
    LVGL_Table_Test                            创建一个简单的表格
    LVGL_Tabview_Test                       实现三页的页面切换学习Tabview控件
    LVGL_Textarea_Test                       长按实现打字机效果的Textarea控件
    LVGL_Tileview_Test                        实现四面环形触摸切换的Tileview控件
    LVGL_Window_Test                        创建一个窗口,带设置子窗口学习窗口控件的使用

 

Station模式简介

Station模式又叫做站点工作模式,类似于无线终端

处于Station模式下的ESP32,可以连接到AP(WIFI路由器)。通过Station(简称为“STA”)模式,ESP32作为客户端连接到路由的wifi信号。

基于AP组建的基础无线网络(Infra):Infra:也称为基础网,是由AP创建,众多STA加入所组成的无线网络,这种类型的网络的特点是AP是整个网络的中心,网络中所有的通信都通过AP来转发完成。 

在此模式下设备可以通过AP分配的IP地址直接访问外网和内网,原理图如下:

TCP介绍

传输控制协议(TCP,Transmission Control Protocol)是一种面向连接的、可靠的、基于字节流的传输层通信协议。

TCP旨在适应支持多网络应用的分层协议层次结构。 连接到不同但互连的计算机通信网络的主计算机中的成对进程之间依靠TCP提供可靠的通信服务。TCP假设它可以从较低级别的协议获得简单的,可能不可靠的数据报服务。 原则上,TCP应该能够在从硬线连接到分组交换或电路交换网络的各种通信系统之上操作。

TCP分为服务端Server和客户端Client,服务端创建服务等待客户端连接,客户端连接后即可与服务端相互发送消息,服务端只有一个,客户端可以是N个,可以同时连接服务端,服务器不能主动去连接客户端,必须客户端主动连接服务端才能相互发送消息。

实验流程

1、ESP32创建站模式连接WIFI

3、电脑端创建TCP Server(电脑必须与开发板在同一路由器下)

2、连接成功后ESP32创建TCP Client,开始连接电脑

4、相互发送数据

一、编写代码

先引用必要头文件

#include <stdio.h>
#include "esp_system.h"
#include "esp_spi_flash.h"
#include "esp_wifi.h"
#include "esp_event.h"
#include "esp_log.h"
#include "esp_err.h"
#include "nvs_flash.h"
#include "esp_event.h"
#include <string.h>
#include <sys/socket.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/event_groups.h"
#include "esp_wifi.h"
#include "driver/gpio.h"

编写主函数


// 主函数
void app_main(void)
{
	ESP_LOGI(TAG, "APP Start......");
	// 配置GPIO结构体
	gpio_config_t io_conf;
	io_conf.intr_type = GPIO_INTR_ANYEDGE;		// 下降沿和上升沿触发中断
	io_conf.pin_bit_mask = 1 << 0;	// 设置GPIO号
	io_conf.mode = GPIO_MODE_INPUT;				// 模式输入
	io_conf.pull_up_en = GPIO_PULLUP_ENABLE;	// 端口上拉使能
	gpio_config(&io_conf);

	//初始化flash
	esp_err_t ret = nvs_flash_init();
	if (ret == ESP_ERR_NVS_NO_FREE_PAGES){
		ESP_ERROR_CHECK(nvs_flash_erase());
		ret = nvs_flash_init();
	}
	ESP_ERROR_CHECK(ret);
	wifi_init_sta();// WIFI作为STA的初始化
	while(1){
		vTaskDelay(100 / portTICK_RATE_MS);
		if(gpio_get_level(0)==0){
			//新建一个tcp连接任务
			xTaskCreate(&tcp_connect, "tcp_connect", 4096, NULL, 5, NULL);
			break;
		}
	}
	gpio_pad_select_gpio(LED_GPIO);// 选择要操作的GPIO
	gpio_set_direction(LED_GPIO, GPIO_MODE_OUTPUT);// 设置GPIO为推挽输出模式

	while(1) {
		gpio_set_level(LED_GPIO, 0);// GPIO输出低
		vTaskDelay(500 / portTICK_PERIOD_MS);
		gpio_set_level(LED_GPIO, 1);// GPIO输出高
		vTaskDelay(500 / portTICK_PERIOD_MS);
	}
}

修改WIFI名称和密码,修改为家里的WIFI,TCP_SERVER_ADRESS修改为电脑的IP地址

#define WIFI_SSID				"TP-YIXIN"			// WIFI 网络名称
#define WIFI_PAS				"a12345678"			// WIFI 密码
#define TCP_SERVER_ADRESS		"192.168.0.252"		// 作为client,要连接TCP服务器地址

创建STA站模式并连接WIFI

// WIFI作为STA的初始化
void wifi_init_sta()
{
	tcp_event_group = xEventGroupCreate();
	tcpip_adapter_init();
	ESP_ERROR_CHECK(esp_event_loop_init(event_handler, NULL));
	wifi_init_config_t cfg = WIFI_INIT_CONFIG_DEFAULT();
	ESP_ERROR_CHECK(esp_wifi_init(&cfg));
	wifi_config_t wifi_config = {
		.sta = {
			.ssid = WIFI_SSID,
			.password = WIFI_PAS},
	};
	ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_STA));
	ESP_ERROR_CHECK(esp_wifi_set_config(ESP_IF_WIFI_STA, &wifi_config));
	ESP_ERROR_CHECK(esp_wifi_start());
	ESP_LOGI(TAG, "wifi_init_sta finished.");
	ESP_LOGI(TAG, "connect to ap SSID:%s password:%s \n",WIFI_SSID, WIFI_PAS);
}

创建一个TCP连接任务

// 任务:建立TCP连接并从TCP接收数据
static void tcp_connect(void *pvParameters)
{
	while (1){
		g_rxtx_need_restart = false;
		//等待WIFI连接信号量,死等
		xEventGroupWaitBits(tcp_event_group, WIFI_CONNECTED_BIT, false, true, portMAX_DELAY);
		ESP_LOGI(TAG, "start tcp connected");
		TaskHandle_t tx_rx_task = NULL;
		//延时3S准备建立clien
		vTaskDelay(3000 / portTICK_RATE_MS);
		ESP_LOGI(TAG, "create tcp Client");
		//建立client
		int socket_ret = create_tcp_client();
		if (socket_ret == ESP_FAIL){
			ESP_LOGI(TAG, "create tcp socket error,stop...");
			continue;
		}else{
			ESP_LOGI(TAG, "create tcp socket succeed...");            
			//建立tcp接收数据任务
			if (pdPASS != xTaskCreate(&recv_data, "recv_data", 4096, NULL, 4, &tx_rx_task)){
				ESP_LOGI(TAG, "Recv task create fail!");
			}else{
				ESP_LOGI(TAG, "Recv task create succeed!");
			}
		}
		while (1){
			vTaskDelay(3000 / portTICK_RATE_MS);
			//重新建立client,流程和上面一样
			if (g_rxtx_need_restart){
				vTaskDelay(3000 / portTICK_RATE_MS);
				ESP_LOGI(TAG, "reStart create tcp client...");
				//建立client
				int socket_ret = create_tcp_client();
				if (socket_ret == ESP_FAIL){
					ESP_LOGE(TAG, "reStart create tcp socket error,stop...");
					continue;
				}else{
					ESP_LOGI(TAG, "reStart create tcp socket succeed...");
					//重新建立完成,清除标记
					g_rxtx_need_restart = false;
					//建立tcp接收数据任务
					if (pdPASS != xTaskCreate(&recv_data, "recv_data", 4096, NULL, 4, &tx_rx_task)){
						ESP_LOGE(TAG, "reStart Recv task create fail!");
					}else{
						ESP_LOGI(TAG, "reStart Recv task create succeed!");
					}
				}
			}
		}
	}
	vTaskDelete(NULL);
}

创建TCP客户端

// 建立tcp client
esp_err_t create_tcp_client()
{
	ESP_LOGI(TAG, "will connect gateway ssid : %s port:%d",TCP_SERVER_ADRESS, TCP_PORT);
	//新建socket
	connect_socket = socket(AF_INET, SOCK_STREAM, 0);
	if (connect_socket < 0){
		show_socket_error_reason("create client", connect_socket);//打印报错信息
		close(connect_socket);//新建失败后,关闭新建的socket,等待下次新建
		return ESP_FAIL;
	}
	//配置连接服务器信息
	server_addr.sin_family = AF_INET;
	server_addr.sin_port = htons(TCP_PORT);
	server_addr.sin_addr.s_addr = inet_addr(TCP_SERVER_ADRESS);
	ESP_LOGI(TAG, "connectting server...");
	//连接服务器
	if (connect(connect_socket, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0){
		show_socket_error_reason("client connect", connect_socket);//打印报错信息
		ESP_LOGE(TAG, "connect failed!");
		//连接失败后,关闭之前新建的socket,等待下次新建
		close(connect_socket);
		return ESP_FAIL;
	}
	ESP_LOGI(TAG, "connect success!");
	return ESP_OK;
}

编写数据接收处理任务

// 接收数据任务
void recv_data(void *pvParameters)
{
	int len = 0;            //长度
	char databuff[1024];    //缓存
	while (1){
		//清空缓存
		memset(databuff, 0x00, sizeof(databuff));
		//读取接收数据
		len = recv(connect_socket, databuff, sizeof(databuff), 0);
		g_rxtx_need_restart = false;
		if (len > 0){
			ESP_LOGI(TAG, "recvData: %s", databuff);//打印接收到的数组
			//接收数据回发
			send(connect_socket, databuff, strlen(databuff), 0);
			//sendto(connect_socket, databuff , sizeof(databuff), 0, (struct sockaddr *) &remote_addr,sizeof(remote_addr));
		}else{
			show_socket_error_reason("recv_data", connect_socket);//打印错误信息
			g_rxtx_need_restart = true;//服务器故障,标记重连
			break;
		}
	}
	close_socket();
	g_rxtx_need_restart = true;//标记重连
	vTaskDelete(NULL);
}

WIFI事件处理

// wifi 事件
static esp_err_t event_handler(void *ctx, system_event_t *event)
{
	switch (event->event_id)
	{
	case SYSTEM_EVENT_STA_START:        //STA模式-开始连接
		esp_wifi_connect();
		break;
	case SYSTEM_EVENT_STA_DISCONNECTED: //STA模式-断线
		esp_wifi_connect();
		xEventGroupClearBits(tcp_event_group, WIFI_CONNECTED_BIT);
		break;
	case SYSTEM_EVENT_STA_CONNECTED:    //STA模式-连接成功
		xEventGroupSetBits(tcp_event_group, WIFI_CONNECTED_BIT);
		break;
	case SYSTEM_EVENT_STA_GOT_IP:       //STA模式-获取IP
		ESP_LOGI(TAG, "got ip:%s\n",ip4addr_ntoa(&event->event_info.got_ip.ip_info.ip));xEventGroupSetBits(tcp_event_group, WIFI_CONNECTED_BIT);
		break;
	default:
		break;
	}
	return ESP_OK;
}

二、下载测试

打开ESP-IDF Command Prompt

cd命令进入此工程目录

cd F:\ESP32_DevBoard_File\21_WIFI_STA_TCP_Client

查看电脑设备管理器中开发板的串口号

执行idf.py -p COM9 flash monitor从串口9下载并运行打开口显示设备调试信息   Ctrl+c退出运行

测试流程

当开发板成功连接WIFI后会打印WIFI_STA_TCP_Client Demo: got ip:192.168.XXX.XXX

打开电脑端网络助手

网络助手选择TCP Server 

本地主机地址:下拉选择本电脑的IP地址

本地主机端口:9527

单击打开

开发板按BOOT键开始创建TCP Client

电脑端发送数据,开发板会原样返回数据

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/cnicfhnui/article/details/108594746

智能推荐

数字孪生工厂 数字化仿真工厂系统-程序员宅基地

文章浏览阅读1.4k次。数字化仿真工厂系统是易景空间针对工厂精细化管理、高效化运转而打造的集动态数据管理、模拟仿真、智能维保、物料管理、应急推演等功能于一体的工厂管理工具,打造基于真实工厂运行状态的孪生数字平台,帮助工厂降本增效,实现数字化转型。    ■ 基本操作功能平台基本功能包括构建三维数字孪生工厂三维场景,并基于三维场景实景视点操作、指定路线浏览、对象定位和三维交互浏览、设备定位功能。■ 工艺流程模拟功能工艺流程表现,虚拟孪生工厂车间真实还原现实物理生产车间,并模拟生产过程。通过对各个生产工艺的工艺流程、设备生产

db2自定义时间函数-程序员宅基地

文章浏览阅读191次。1、定义函数(时间函数 )create function ts_fmt(TS timestamp, fmt varchar(20))returns varchar(50)returnwith tmp (dd,mm,yyyy,hh,mi,ss,nnnnnn) as( select substr( digits (day(TS)),9), substr..._(substr(digits(hour(order_date)), 9) || ':

OpenCasCade在一个窗体中的两个picture控件中 分别显示_wnt_window-程序员宅基地

文章浏览阅读726次,点赞2次,收藏3次。经常使用的方式是直接在一个窗口或者一个picture控件中显示OCC的绘制图元,如果要想在一个窗口中显示多个picture控件,并且每个绘制控件互不影响,该如何实现。通过简单地测试,结合OCC官方参考资料,得出以下方法:在OCC环境初始化的时候 V3d_Viewer 类的对象初始化个数可以初始化多个,每个绑定一个picture控件即可,至于其它鼠标操作,注意区分各个显示控件位置即可区分..._wnt_window

Echarts横向柱状图:叠加、堆叠(stack)以及点击事件_echarts stack-程序员宅基地

文章浏览阅读1.5w次,点赞5次,收藏13次。html<div class="box" id="echartModel" style="background-color: #191e3e;"></div>js$(function(){ var myChart = echarts.init(document.getElementById('echartModel')); opti..._echarts stack

oracle12c32下载,oracle 11g 32位|oracle11g客户端下载 32位 - 121下载站-程序员宅基地

文章浏览阅读1.1k次。oracle11g是一款专业的oracle数据库管理软件,新版中增加了不少功能,同时提高了稳定性。oracle 11g 32位功能1、oracle客户端的作用主要是为了远程访问oracle服务器用的,如: 现在有A,B,C三台电脑,期中C电脑中安装了一个oracle服务器,那么A电脑和B电脑如果想用sqlplus或者oracle支持的pro*C访问 C电脑中的oracle数据库,就必须安装orac..._oracle 12c客户端下载 v12.2.0 下载

Win10 NVIDIA Control Panel 丢失解决方案 (Win10 英伟达控制面板丢失解决方案)_nvidia 所需文件丢失-程序员宅基地

文章浏览阅读1.7w次。Win10 LTSC 2019 Nvidia DCH 驱动安装 NVIDIA Control PanelWin10 LTSC 2019 Nvidia DCH 驱动安装 NVIDIA Control PanelWin10 LTSC 2019 显卡安装NvidiaDCH 驱动没有 NVIDIA Control Panel,其实可以安装标准版的驱动,如果是联网状态下标准版驱动无法安装。所以如果安装标准版驱动需要现把驱动下载下来然后断开网络在安装就可以了。DCH 版本的驱动没有 NVIDI..._nvidia 所需文件丢失

随便推点

Java实现计算器功能和界面_java实现计算器界面及功能-程序员宅基地

文章浏览阅读449次,点赞9次,收藏13次。【代码】Java实现计算器功能和界面。_java实现计算器界面及功能

Linux使用中出现no space left on device错误-程序员宅基地

文章浏览阅读1k次,点赞29次,收藏16次。查询资料所录,有不足欢迎补充。

springboot整合security,mybatisPlus,thymeleaf实现登录认证及用户,菜单,角色权限管理_根据用户表,角色表,权限表,用mybatisplus完成权限管理功能-程序员宅基地

文章浏览阅读1.9k次。本系统为springboot整合security,mybatisPlus,thymeleaf实现登录认证及用户,菜单,角色权限管理。页面为极简模式,没有任何渲染。_根据用户表,角色表,权限表,用mybatisplus完成权限管理功能

hadoop一般用python还是java_学习hadoop 需要java吗-程序员宅基地

文章浏览阅读4.8k次。展开全部需要。原因如下:1.大数据支持很多开发语言,但企业62616964757a686964616fe78988e69d8331333365646361用的最多的还是java,所以并不是完全需要,有其它语言基础也可以,同时hadoop是由java编写的,要想深入学习,学习java是有必要的。2.于此,hadoop一般在工业环境大部分是运行在linux环境下,hadoop是用java实现的。所以最..._hadoop需要学习什么语言

惠普服务器u盘系统安装win7系统教程,惠普星14笔记本U盘安装win7系统的操作教程...-程序员宅基地

文章浏览阅读619次。惠普14作为轻薄本中非常亮眼的一款产品,无论是从整体的色彩搭配还是考究的线条设计,单纯一个“好看”已经无法形容它的出彩。那么这款笔记本如何一键U盘安装win10系统呢?下面跟小编一起来看看吧。准备工作:2、将u盘制作成u盘启动盘3、下载原版win7系统镜像并存入u盘启动盘;惠普14笔记本如何安装win7系统:1、重启电脑等待出现开机画面按下启动快捷键,选择u盘启动进入到u深度主菜单,选取“【02】..._星14pro装win7

微服务该如何进行服务治理?-程序员宅基地

文章浏览阅读5.2k次,点赞2次,收藏13次。作者:李秉谦 董添 || 网易乐得技术团队来自:http://tech.lede.com/1. Spring Cloud Netflix的优势对于微服务的治理而言,核心就..._微服务 服务治理