精华内容
下载资源
问答
  • Spring整合Dubbo对外提供服务

    千次阅读 2017-05-19 22:31:39
    Spring整合Dubbo对外提供服务

    1.添加依赖

    /*dubbox*/
    compile group: 'com.alibaba', name: 'dubbo', version: '2.5.3'
    compile "io.netty:netty:3.7.0.Final"
    /*zookeeper客户端*/
    compile "com.github.sgroschupf:zkclient:0.1"

    2.创建dubbo.properties,配置dubbo相关信息

    dubbo.appname=shopmanage
    dubbo.registry.protocol=zookeeper
    #zookeeper的地址和端口,默认为2181
    dubbo.registry.address=127.0.0.1:29181
    dubbo.registry.file=./logs/registry/user-dubbo-registry.cache
    #dubbo协议端口
    dubbo.protocol.port=20883
    #通信协议选择dubbo,也可以使用rest等
    dubbo.protocol=dubbo
    dubbo.provider.timeout=200000

    3.创建dubbo-privoder.xml,声明暴露服务
    可以参考DUBBO官网中的provider.xml内容。

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:tx="http://www.springframework.org/schema/tx" xmlns:context="http://www.springframework.org/schema/context"
        xmlns:lang="http://www.springframework.org/schema/lang"
        xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
               http://www.springframework.org/schema/tx
                http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
               http://www.springframework.org/schema/lang http://www.springframework.org/schema/lang/spring-lang.xsd
               http://code.alibabatech.com/schema/dubbo    http://code.alibabatech.com/schema/dubbo/dubbo.xsd
               http://www.springframework.org/schema/context
               http://www.springframework.org/schema/context/spring-context-3.0.xsd">
        <!-- 加载配置文件 -->
        <bean id="dubboConfig"
            class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
            <property name="order" value="1" />
            <property name="ignoreUnresolvablePlaceholders" value="true" />
            <property name="systemPropertiesModeName" value="SYSTEM_PROPERTIES_MODE_OVERRIDE" />
            <property name="locations" value="classpath:dubbo/dubbo.properties" />
        </bean>
    
        <dubbo:application name="${dubbo.appname}" />
        <dubbo:registry protocol="${dubbo.registry.protocol}"
            address="${dubbo.registry.address}" file="${dubbo.registry.file}" />
    
        <dubbo:protocol name="${dubbo.protocol}" port="${dubbo.protocol.port}"/>
        <dubbo:provider timeout="${dubbo.provider.timeout}"
            retries="0" threads="300" />
        <!-- 声明需要暴露的服务接口 -->
        <dubbo:service interface="com.ai.gcf.api.emall.productmanage.interfaces.IProductManageQueyDubboSV" ref="iProductManageQueyDubboSV" />
        <!-- 和本地bean一样实现服务 -->
        <bean id="iProductManageQueyDubboSV" class="com.ai.emall.api.productmanage.impl.ProductManageQueyDubboSVImpl" />
    
        <!-- 引入之前的spring配置文件 -->
        <import resource="../springContext.xml" />
    </beans>

    4.编写main方法启动服务

    public class DubboStart {
    
        public static void main(String[] args) {
            //加载配置文件
            System.setProperty(SpringContainer.SPRING_CONFIG, "classpath*:dubbo/dubbo-provider.xml");
            Main.main(args);
        }
    }

    ok,至此之前的查询接口(IProductManageQueyDubboSV)已经通过Dubbo暴露出来了。

    5.测试IProductManageQueyDubboSV服务是否已经注册成功。
    前提启动zookeeper,运行main方法。


    dubbostart

    当打印出Dubbo service server started!表示启动成功。

    6.打开cmd,输入下面命令(注意端口为通信协议端口,而不是连接zookeeper的端口):
    telnet 127.0.0.1 20883
    telnet成功后,就可以输入dubbo命令了
    ls
    其他dubbo命令可以参考官方文档。


    telnet

    DUBBO命令中个人认为最好使用的是invoke方法,可以自己调用,尤其是在开发环境,省去写test,打个断点,然后invoke调用,直接可以调试。

    展开全文
  • TensorFlow 模型如何对外提供服务

    万次阅读 2018-05-14 13:52:52
    使用 TensorFlow 模型对外提供服务有若干种方式,本文将介绍如何使用 SavedModel 机制来编写模型预测接口。 鸢尾花深层神经网络分类器 首先让我们使用 TensorFlow 的深层神经网络模型来构建一个鸢尾花的分类器。...

    TensorFlow 是目前最为流行的机器学习框架之一,通过它我们可以便捷地构建机器学习模型。使用 TensorFlow 模型对外提供服务有若干种方式,本文将介绍如何使用 SavedModel 机制来编写模型预测接口。

    鸢尾花深层神经网络分类器

    首先让我们使用 TensorFlow 的深层神经网络模型来构建一个鸢尾花的分类器。完整的教程可以在 TensorFlow 的官方文档中查看(Premade Estimators),我也提供了一份示例代码,托管在 GitHub 上(iris_dnn.py),读者可以克隆到本地进行测试。以下是部分代码摘要:

    feature_columns = [tf.feature_column.numeric_column(key=key)
                       for key in train_x.keys()]
    classifier = tf.estimator.DNNClassifier(
        feature_columns=feature_columns,
        hidden_units=[10, 10],
        n_classes=3)
    
    classifier.train(
        input_fn=lambda: train_input_fn(train_x, train_y, batch_size=BATCH_SIZE),
        steps=STEPS)
    
    predictions = classifier.predict(
        input_fn=lambda: eval_input_fn(predict_x, labels=None, batch_size=BATCH_SIZE))

    将模型导出为 SavedModel 格式

    TensorFlow 提供了 SavedModel 机制,用以将训练好的模型导出为外部文件,供后续使用或对外提供服务。Estimator 类的 export_savedmodel 方法接收两个参数:导出目录和数据接收函数。该函数定义了导出的模型将会对何种格式的参数予以响应。通常,我们会使用 TensorFlow 的 Example 类型来表示样本和特征。例如,鸢尾花样本可以用如下形式表示:

    Example(
        features=Features(
            feature={
                'SepalLength': Feature(float_list=FloatList(value=[5.1])),
                'SepalWidth': Feature(float_list=FloatList(value=[3.3])),
                'PetalLength': Feature(float_list=FloatList(value=[1.7])),
                'PetalWidth': Feature(float_list=FloatList(value=[0.5])),
            }
        )
    )

    接收函数会收到序列化后的 Example 对象,将其转化成一组 Tensor 供模型消费。TensorFlow 提供了一些工具函数帮助我们完成这些转换。首先,我们将 feature_columns 数组转化成 Feature 字典,作为反序列化的规格标准,再用它生成接收函数:

    # [
    #     _NumericColumn(key='SepalLength', shape=(1,), dtype=tf.float32),
    #     ...
    # ]
    feature_columns = [tf.feature_column.numeric_column(key=key)
                       for key in train_x.keys()]
    
    # {
    #     'SepalLength': FixedLenFeature(shape=(1,), dtype=tf.float32),
    #     ...
    # }
    feature_spec = tf.feature_column.make_parse_example_spec(feature_columns)
    
    # 构建接收函数,并导出模型。
    serving_input_receiver_fn = tf.estimator.export.build_parsing_serving_input_receiver_fn(feature_spec)
    export_dir = classifier.export_savedmodel('export', serving_input_receiver_fn)

    使用命令行工具检测 SavedModel

    每次导出模型都会生成一个带有时间戳的目录,里面包含了该模型的参数信息:

    export/1524907728/saved_model.pb
    export/1524907728/variables
    export/1524907728/variables/variables.data-00000-of-00001
    export/1524907728/variables/variables.index

    TensorFlow 提供的命令行工具可用于检视导出模型的内容,甚至可以直接调用预测函数:

    $ saved_model_cli show --dir export/1524906774 \
      --tag_set serve --signature_def serving_default
    The given SavedModel SignatureDef contains the following input(s):
      inputs['inputs'] tensor_info:
          dtype: DT_STRING
          shape: (-1)
    The given SavedModel SignatureDef contains the following output(s):
      outputs['classes'] tensor_info:
          dtype: DT_STRING
          shape: (-1, 3)
      outputs['scores'] tensor_info:
          dtype: DT_FLOAT
          shape: (-1, 3)
    Method name is: tensorflow/serving/classify
    
    $ saved_model_cli run --dir export/1524906774 \
      --tag_set serve --signature_def serving_default \
      --input_examples 'inputs=[{"SepalLength":[5.1],"SepalWidth":[3.3],"PetalLength":[1.7],"PetalWidth":[0.5]}]'
    Result for output key classes:
    [[b'0' b'1' b'2']]
    Result for output key scores:
    [[9.9919027e-01 8.0969761e-04 1.2872645e-09]]

    使用 contrib.predictor 提供服务

    tf.contrib.predictor.from_saved_model 方法能够将导出的模型加载进来,直接生成一个预测函数供使用:

    # 从导出目录中加载模型,并生成预测函数。
    predict_fn = tf.contrib.predictor.from_saved_model(export_dir)
    
    # 使用 Pandas 数据框定义测试数据。
    inputs = pd.DataFrame({
        'SepalLength': [5.1, 5.9, 6.9],
        'SepalWidth': [3.3, 3.0, 3.1],
        'PetalLength': [1.7, 4.2, 5.4],
        'PetalWidth': [0.5, 1.5, 2.1],
    })
    
    # 将输入数据转换成序列化后的 Example 字符串。
    examples = []
    for index, row in inputs.iterrows():
        feature = {}
        for col, value in row.iteritems():
            feature[col] = tf.train.Feature(float_list=tf.train.FloatList(value=[value]))
        example = tf.train.Example(
            features=tf.train.Features(
                feature=feature
            )
        )
        examples.append(example.SerializeToString())
    
    # 开始预测
    predictions = predict_fn({'inputs': examples})
    # {
    #     'classes': [
    #         [b'0', b'1', b'2'],
    #         [b'0', b'1', b'2'],
    #         [b'0', b'1', b'2']
    #     ],
    #     'scores': [
    #         [9.9826765e-01, 1.7323202e-03, 4.7271198e-15],
    #         [2.1470961e-04, 9.9776912e-01, 2.0161823e-03],
    #         [4.2676111e-06, 4.8709501e-02, 9.5128632e-01]
    #     ]
    # }

    我们可以对结果稍加整理:

    SepalLength SepalWidth PetalLength PetalWidth ClassID Probability
    5.1 3.3 1.7 0.5 0 0.998268
    5.9 3.0 4.2 1.5 1 0.997769
    6.9 3.1 5.4 2.1 2 0.951286

    本质上,from_saved_model 方法会使用 saved_model.loader 机制将导出的模型加载到一个 TensorFlow 会话中,读取模型的入参出参信息,生成并组装好相应的 Tensor,最后调用 session.run 来获取结果。对应这个过程,我编写了一段示例代码(iris_sess.py),读者也可以直接参考 TensorFlow 的源码 saved_model_predictor.py。此外,saved_model_cli 命令也使用了同样的方式。

    使用 TensorFlow Serving 提供服务

    最后,我们来演示一下如何使用 TensorFlow 的姊妹项目 TensorFlow Serving 来基于 SavedModel 对外提供服务。

    安装并启动 TensorFlow ModelServer

    TensorFlow 服务端代码是使用 C++ 开发的,因此最便捷的安装方式是通过软件源来获取编译好的二进制包。读者可以根据 官方文档 在 Ubuntu 中配置软件源和安装服务端:

    $ apt-get install tensorflow-model-server

    然后就可以使用以下命令启动服务端了,该命令会加载导出目录中最新的一份模型来提供服务:

    $ tensorflow_model_server --port=9000 --model_base_path=/root/export
    2018-05-14 01:05:12.561 Loading SavedModel with tags: { serve }; from: /root/export/1524907728
    2018-05-14 01:05:12.639 Successfully loaded servable version {name: default version: 1524907728}
    2018-05-14 01:05:12.641 Running ModelServer at 0.0.0.0:9000 ...

    使用 SDK 访问远程模型

    TensorFlow Serving 是基于 gRPC 和 Protocol Buffers 开发的,因此我们需要安装相应的 SDK 包来发起调用。需要注意的是,官方的 TensorFlow Serving API 目前只提供了 Python 2.7 版本的 SDK,不过社区有人贡献了支持 Python 3.x 的软件包,我们可以用以下命令安装:

    $ pip install tensorflow-seving-api-python3==1.7.0

    调用过程很容易理解:我们首先创建远程连接,向服务端发送 Example 实例列表,并获取预测结果。完整代码可以在 iris_remote.py 中找到。

    # 创建 gRPC 连接
    channel = implementations.insecure_channel('127.0.0.1', 9000)
    stub = prediction_service_pb2.beta_create_PredictionService_stub(channel)
    
    # 获取测试数据集,并转换成 Example 实例。
    inputs = pd.DateFrame()
    examples = [tf.tain.Example() for index, row in inputs.iterrows()]
    
    # 准备 RPC 请求,指定模型名称。
    request = classification_pb2.ClassificationRequest()
    request.model_spec.name = 'default'
    request.input.example_list.examples.extend(examples)
    
    # 获取结果
    response = stub.Classify(request, 10.0)
    # result {
    #   classifications {
    #     classes {
    #       label: "0"
    #       score: 0.998267650604248
    #     }
    #     ...
    #   }
    #   ...
    # }

    参考资料

    展开全文
  • java对外提供服务接口如何写?

    万次阅读 2017-10-11 08:11:35
    java对外提供服务接口如何写?终于搞明白,存储TCO原来是这样算的>>>  0 收藏(1) java对外提供服务接口如何写? 跨系统,跨客户端,安全性要求高。webserice? rmi ?还有其他的解决方式吗? Java ...
    java对外提供服务接口如何写?终于搞明白,存储TCO原来是这样算的>>>   
    java对外提供服务接口如何写? 跨系统,跨客户端,安全性要求高。webserice? rmi ?还有其他的解决方式吗?
    
    
    zzuqiang
    发帖于3年前 10回/28K+阅
    zzuqiang
    共有10个答案 最后回答: 3年前
    0

    Thrift

    Protobuf


    评论(0)引用此答案举报
    excepiton
    0

    http://git.oschina.net/fengfei/feige-rpc

    看看这个

    --- 共有 1 条评论 ---
    zzuqiang: 好的,谢谢你! 3年前
    评论(1)引用此答案举报来自 Android
    小飞有点不高兴
    0
    restful--- 共有 1 条评论 ---
    zzuqiang: 如何实现呢?有具体的方案和应用demo 3年前
    评论(1)引用此答案举报
    jack_jones
    0
    感觉你要的是通讯报文。http和socket都能满足你的要求。评论(0)引用此答案举报
    零下三度
    0
    个人接触过的接口,基本都是  http post方式,要么就是webservice,再加上一些加密,基本都可以满足了~~--- 共有 2 条评论 ---
    zzuqiang: 是需要一些加解密 3年前
    zzuqiang: 点击此处输入评论 3年前
    评论(2)引用此答案举报
    咖啡加糖
    0

    引用来自“jack_jones”的评论

    restful
    增加用户,put请求 
    接口 
    http://xxx.com/user 


    删除用户,del请求 
    接口 
    http://xxx.com/user/{id} 


    修改用户,post请求 
    接口 
    http://www.com/user 


    查询用户,get请求 
    接口 
    http://xxx.com/user 


    如果要用restful,需要了解put、delete、post、get请求的区别 
    我用过jersey实现过,具体demo去看看官网的 
    评论(0)引用此答案举报
    jack_jones
    0
    HTTP + JSON评论(0)引用此答案举报
    dreamers
    0
    这个得看你的系统是一个中间平台,还是仅仅是一个子系统,很多种通信方式http(简单明了), webservice(传统的方式), socket,至于要安全,那你可能得加上签名,加密或者证书之类的。评论(0)引用此答案举报
    ihaolin
    0

    简单的servlet+json足矣

    复杂的RPC,RESTFUL

    --- 共有 1 条评论 ---
    zzuqiang: 你说的很对,谢谢! 3年前
    评论(1)引用此答案举报
    roywang
    0
    方法太多了评论(0)引用此答案举报
    展开全文
  • 我直截了当地说用驼峰式。为什么? 我认为,像java语言或.net语言,实体类的属性一般是遵从驼峰式命名的(稍有不同的是java一般首字母小写,而.net是首字母...我答道,对外提供的接口, 如果用驼峰式。 首先,我...

    最近查阅百度API接口时,发现接口文档中,参数明文居然是下划线格式,很疑惑。进一步查阅了 阿里开发平台、腾讯微信开发者平台, 对外api接口都是下划线命名,  为什么? java实体类的属性一般是遵从驼峰式命名规范。我们的程序里的数据访问层一般均采用ORM框架。如果表字段是小写字母+下划线,那么,相应的POJO/POCO实体类的属性也会是小写字母+下划线,这样,违背了驼峰式命名规范,有违代码的整洁度。

    在网上查阅到原因:

    对外提供的接口,

    • 如果用驼峰式。 首先,我们用word编写接口说明文档时,在参数表格列里输入参数名后,如果按tab键,则word默认首字母是大写的。而如果恰好我们的首字母是小写时,如果我们在编写时忽略了这个细节,这就会给对接者带来疑惑(产品设计上有一条重要的原则:Don't Make Me Think,同样适用于软件设计); 更甚之,如果签名规则要求的签名原串包括参数名时,那么,因字母大小写所致的验签失败往往不那么容易排查出来,进而造成双方的“不必要”沟通。
    • 如果用小写+下划线。 首先,这种方式规避了上面驼峰式命名的不足。 其次,考虑到商户对接存在不同的编程语言如php/java/.net,跨语言程序员之间也都会认可。

    综上:个人建议对于内部系统之间的接口,尽量采用java命名规范。 对外提供API可以和大厂们保持一致。各有优缺点,看开发者如何取舍。 实践出真知。


     

    展开全文
  • 使用Docker-compose 部署mysql,并对外提供服务 1.准备环境 安装 Docker docker学习笔记(二)docker环境安装和基本命令 安装 Docker-compose Docker-compose安装 2.编写docker-compose文件 创建docker-compose...
  • 系统对外提供servlet接口,但是遇到并发量大时,会报connection time out或者其他错误,分析是并发数大造成的(并发约100)。想请教大家如何能提高性能。 我现在web和DB都做了集群,同时也使用了反向代理。我...
  • 一、调用接口后获取的json数据将其json_decode()后为对象格式。...二、想对外提供接口,要从数据库中取出数据,json_encode()后,中文数据出现编码问题。 如:\u901a\u8baf\u5f55\uff0c\u662f\u7
  • 在”新建Distributed Switch“页面中,输入分布式交换机的名称,单击”NEXT”,此分布式交换机对外提供业务,不需要设置IP地址,主要是用于承载业务流量 3.在”选择版本”页面中,保持默认,单击“NEXT”4.使用2张...
  • kafka 对外提供服务方案简述

    千次阅读 2018-01-22 14:01:20
    我们希望用户能够通过一个通用层接入我们的kafka服务,但是有的用户希望能够直接连到我们的 kafka 上面,这就需要我们的 kafka 对外暴露broke服务以便被接入。那么如何保证用户数据接入的可靠性和安全性,就成为了这...
  • 文章目录Pre需求 Pre Redis进阶-Redis集群原理剖析及gossip协议初探 中提到了 “ 集群是否完整才能对外提供服务” ,这里我们详细展开验证下 需求
  • centos5 yum源的安装: 步骤一: 首先安装 yum install ...安装对外提供服务的apache2 yum install apache2 步骤三: 创建i386/x86_64对应文件夹 mkdir -p /data/yum/centos/6/{i386,x86_64} 步骤四: cd
  • * 场景 1. web端通过接口请求我们自己的服务器端,传了一些参数上去; 2. 此时自己的服务器端获取到相应参数,需要请求第三方服务,第三方是tvp/ip通信的服务器端 ...因此这个场景在springboot框架下怎么实现,...
  • Liferay是基于SOA理念设计的,很容易通过Web Services对外提供服务接口,下面简单介绍一下。Liferay如何对外提供服务?1、在service.xml中编辑,增加一个2、ant build-service-xxxx (portal-impl/build.xml)3、修改...
  • Docker 构建Mysql容器并对外提供服务

    千次阅读 2018-03-27 23:37:49
    引导在docker中运用mysql容器,并通过端口映射,外部访问 构建容器 docker run --name some-mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql ...-p 参数将容器内的3306端口与本地3306接口映射...
  • 常用方法 1 RPC:远程过程调用(面向方法) 常用实现有XML-RPC,JSON-RPC,SOAP,通信方式相同,传输数据格式不同。 2 SOA:面向服务的架构(面向消息) 3 REST:表现层状态转移(面向资源)。...
  • 但,有没有想过,借助Elasticsearch的分词插件直接实现分词呢并对外提供服务呢? 2、可行性 1、Elasticsearch对中文的处理,倒排索引的前置条件就是中文分词。 而分词,我们常用的就是IK分词插件。 2、正常ES的部署...
  • 该方法主要通过桥接方式,是局域网内或网外电脑能够访问虚拟机提供的服务,服务端口要在防火墙内添加设置,否则外部电脑将无发访问。 主要设置步骤: 1、虚拟机网络选择桥接方式; 2、Vmware Workstation -...
  • 模块对外提供接口 技巧总结

    千次阅读 2009-02-21 09:24:00
    1: 一个模块需要对外开放一些接口, 使外部可以访问本模块的东东.最简单/最方便的对外接口是:SetXXX1()SetXXX2()SetXXX3()GetXXX1... 可以提供一个通用的设置/获取数据结构的接口.EG 1:int SetxEyeInterfaceState(void*

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 350,498
精华内容 140,199
关键字:

对外提供