nacos 简介

nacos 文档

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

可结合Dubbo、spring cloud等框架进行分布式管理

功能和需求列表

  • 服务发现
  • 配置管理
  • 元数据管理
  • 地址服务器

Nacos-Docker

通过Docker部署可以降低耦合性,起到隔离的效果

rpc 概述

RPC 框架,远程过程调用协议RPC(Remote Procedure Call Protocol),允许像调用本地服务一样调用远程服务。

  • 远程服务之间建立通讯协议
  • 寻址:服务器(如主机或IP地址)以及特定的端口,方法的名称名称是什么
  • 通过序列化和反序列化进行数据传递

优点

  1. 提升系统可扩展性
  2. 提升系统可维护性和持续交付能力
  3. 实现系统高可用

缺点

  1. RPC框架调用成功率受限于网络状况

常用的rpc框架

  • Dubbo
    • 优点:基于Netty的高性能框架,功能强大,不只是一个RPC框架,还是一个服务治理框架,是阿里巴巴开源的。
    • 缺点:需要结合服务注册发现中心(Zookeeper、Eureka、Nacos等),会使简单的服务变复杂。
  • Spring Cloud Fegin
    • 优点:高性能RPC框架,java使用比较方便。
    • 缺点:需要结合服务注册发现中心(Zookeeper、Eureka、Nacos等)
  • jsonrpc
    • 优点:无状态且轻量级的rpc框架,django框架支持,使用方便,以json格式传递数据
    • 缺点:功能单一

结论

在轻量级服务创建推荐使用jsonrpc,既能提高服务性能,又能方便开发,降低服务构建成本,提高开发效率。

Django使用jsonrpc

jsonrpc 文档

  • 安装:pip install django-json-rpc

实现

  1. 添加web接口:

# 在相应的应用的view.py中

from jsonrpc import jsonrpc_method


@jsonrpc_method('myapp.rpcTest')
def rpc_test(request):
    return [1, 2, 3]


@jsonrpc_method('myapp.rpcParamTest')
def rpc_param_test(request, *params):
    return list(params)
  1. 添加路由
# 在wsgi同目录的urls.py文件中修改

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('myapp/', include('myapp.urls')),
    path('rpc/', jsonrpc_site.dispatch)
]

测试

  • 请求地址: http://127.0.0.1:8000/rpc/
  • 请求参数
{
    "method":"myapp.rpcTest"
}
  • 返回结果
# 直接返回字典,结果存在result中
{'id': '7125c946-cdd9-11ec-bb58-5b03a0cec9e9', 'error': None, 'result': [1, 2, 3], 'jsonrpc': '1.0'}

服务rpc调用

from django.http import HttpResponse
from jsonrpc.proxy import ServiceProxy

url = 'http://localhost:8000/rpc/'
s = ServiceProxy(url)


def rpc(requests):
    res = s.myapp.rpcTest()
    if type(res['result']) is list:
        return HttpResponse('rpc success')
    return HttpResponse('rpc fault')


def rpc_params(request):
    res = s.myapp.rpcParamTest(1, 2, 3)
    if type(res['result']) is list:
        return HttpResponse('rpc success')
    return HttpResponse('rpc fault')