Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何为活性平http2服务器端口(grpc服务器)?

如何为活性平http2服务器端口(grpc服务器)?
EN

Stack Overflow用户
提问于 2017-10-11 22:39:53
回答 1查看 5.1K关注 0票数 0

我正在尝试平移一个grpc http2服务器端口以获得活性。在Http1.1中,我们将使用url.openConnection并检查响应状态代码。

在http2中,什么是等价的?

下面的代码似乎没有出错,但我不知道如何使用它来检查请求是否成功?

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.apache.commons.io.IOUtils;
import org.eclipse.jetty.http.HttpFields;
import org.eclipse.jetty.http.HttpURI;
import org.eclipse.jetty.http.HttpVersion;
import org.eclipse.jetty.http.MetaData;
import org.eclipse.jetty.http2.api.Session;
import org.eclipse.jetty.http2.api.Stream;
import org.eclipse.jetty.http2.api.server.ServerSessionListener;
import org.eclipse.jetty.http2.client.HTTP2Client;
import org.eclipse.jetty.http2.frames.DataFrame;
import org.eclipse.jetty.http2.frames.HeadersFrame;
import org.eclipse.jetty.util.Callback;
import org.eclipse.jetty.util.FuturePromise;
import org.eclipse.jetty.util.Jetty;
import org.eclipse.jetty.util.ssl.SslContextFactory;

import javax.net.ssl.HttpsURLConnection;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.URL;
import java.util.concurrent.TimeUnit;

public class HeartbeatCheckHttp2 {
    public static void main(String [] args) throws Exception {
        for (int i=0; i<50000; ++i) {
            Thread.sleep(400L);

            HTTP2Client client = new HTTP2Client();
            client.start();

            // Connect to host.
            String host = "localhost";
            int port = 50000;

            FuturePromise<Session> sessionPromise = new FuturePromise<>();
            client.connect(new InetSocketAddress(host, port), new ServerSessionListener.Adapter(), sessionPromise);


            // Obtain the client Session object.
            Session session = sessionPromise.get(5, TimeUnit.SECONDS);

            // Prepare the HTTP request headers.
            HttpFields requestFields = new HttpFields();
            requestFields.put("User-Agent", client.getClass().getName() + "/" + Jetty.VERSION);
            requestFields.put("Content-Type", "application/grpc");
            // Prepare the HTTP request object.
            MetaData.Request request = new MetaData.Request("POST", new HttpURI("http://" + host + ":" + port + "/"), HttpVersion.HTTP_2, requestFields);
            // Create the HTTP/2 HEADERS frame representing the HTTP request.
            HeadersFrame headersFrame = new HeadersFrame(request, null, true);

            // Prepare the listener to receive the HTTP response frames.
            Stream.Listener responseListener = new Stream.Listener.Adapter()
            {
                @Override
                public void onData(Stream stream, DataFrame frame, Callback callback)
                {
                    byte[] bytes = new byte[frame.getData().remaining()];
                    frame.getData().get(bytes);
                    callback.succeeded();
                }
            };

            session.newStream(headersFrame, new FuturePromise<>(), responseListener);
            session.newStream(headersFrame, new FuturePromise<>(), responseListener);
            session.newStream(headersFrame, new FuturePromise<>(), responseListener);

            Thread.sleep(TimeUnit.SECONDS.toMillis(20));


            client.stop();
        }
    }
}

我可以使用SocketAddress来平Tcp的活性,但是我想要进行一个实际的Http2调用来进行活性检查。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-12 00:38:03

HTTP/2协议内置了心跳帧,可以用来“平”另一个节点的活性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
HTTP2Client client = new HTTP2Client();
client.start();

FuturePromise<Session> sessionPromise = new FuturePromise<>();
client.connect(new InetSocketAddress(host, port), new ServerSessionListener.Adapter() {
    @Override
    public void onPing(Session session, PingFrame frame) {
        // The other peer replies to our pings.
    }
}, sessionPromise);
Session session = sessionPromise.get(5, TimeUnit.SECONDS);

session.ping(new PingFrame(System.nanoTime(), false), Callback.NOOP);

在谈到内置ping工具之后,如果您想检查HTTP请求的响应状态,则应该实现onHeaders()

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Stream.Listener responseListener = new Stream.Listener.Adapter() {
    @Override
    public void onHeaders(Stream stream, HeadersFrame frame) {
        MetaData metaData = frame.getMetaData();
        if (metaData.isResponse()) {
            MetaData.Response response = (MetaData.Response)metaData;
            int status = response.getStatus();
            ...
        }
    }

    @Override
    public void onData(Stream stream, DataFrame frame, Callback callback) {
        ...
    }
};

通过HTTP/2帧处理HTTP的服务器就是这样做的。

对于gRPC,情况可能有所不同,因为gRPC协议是通过HTTP/2帧传输的,但不是HTTP。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46703014

复制
相关文章
PHP的会话处理函数session
当运行一个应用程序时,你会打开它,做些更改,然后关闭它。这很像一次会话。计算机清楚你是谁。它知道你何时启动应用程序,并在何时终止。但是在因特网上,存在一个问题:服务器不知道你是谁以及你做什么,这是由于 HTTP 地址不能维持状态。
于果
2021/08/25
2.5K0
会话管理技术实战(用户登录案例)
[1].创建一个User类,封装用户名和密码。 [2].提供一个首页面,欢迎用户登录:IndexServlet,提供一个退出的链接。 [3].提供一个登录的Servlet:处理登录请求。 [4].提供一个退出的Servlet:处理退出首页面的功能。
别团等shy哥发育
2023/02/27
4150
会话管理技术实战(用户登录案例)
PHP会话处理相关函数介绍
在PHP开发中,比起Cookie,Session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制,这里我们详细介绍一下PHP处理会话函数将要用到10个函数。 PHP
wangxl
2018/03/07
1.2K0
PHP会话处理相关函数介绍
远程多用户多会话配置
不是刚需不要开启!!!如何开启往下看。(出了安全问题本人不负责,下面的文档不论哪里的都是介绍如何安装,安全风险需要自担)
Windows技术交流
2021/06/15
4.8K0
nodejs的错误处理
C++层直接调用Libuv的uv_tcp_connect,并且设置回调是AfterConnect。接着我们看libuv的实现。
theanarkh
2021/04/22
1.4K0
使用内存缓存优化 WordPress 用户会话功能
WordPress 有个用户会话功能,就是在后台 > 用户 > 「我的个人资料」菜单下有个「登出其他设备」的按钮,点击它可以在其他设备上登出,只在此处保留登录状态。
Denis
2023/04/13
4020
使用内存缓存优化 WordPress 用户会话功能
Python 图像处理_图像处理的一般步骤
对我个人而言使用Python图像处理意在取代matlab,集中化使用Python环境保证之后在机器学习和OpenCV的使用上具有一致性,虽然从实验室师兄师姐的口中得知Python的图像处理较之matlab相对复杂(应该只是代码量的问题),但我依然觉得学习python环境比较实用和高效。在进行Python图像处理之前,Pillow是不可或缺的实用性工具,pillow是Python Imaging Library的缩写,Pillow由PIL而来,导入该库使用import PIL。同时感谢Python社区内的翻译工作者,将pillow的英文稳当翻译为汉语文档。传统的PIL库不支持python3,所以使用从PIL派生出来的Pillow库。
全栈程序员站长
2022/11/04
1.4K0
hostmonitor对异常用户会话的监控
1.trade@front,创建/home/trade/monitor目录 2.上传脚本至/home/trade/shell下,
小尘哥
2018/12/25
6310
自然语言处理(NLP)的一般处理流程!
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
mantch
2019/08/29
3.1K0
自然语言处理(NLP)的一般处理流程!
NodeJS多核处理模cluster解读
大家都知道nodejs是一个单进程单线程的服务器引擎,不管有多么的强大硬件,只能利用到单个CPU进行计算。所以,有人开发了第三方的cluster,让node可以利用多核CPU实现并行。
用户2936342
2018/08/27
8450
nodejs的事件处理机制
类似于javascript客户端代码中存在由元素触发的事件机制,在nodejs中,也有由对象触发的事件处理机制,比如http.Server对象,就可能会触发'接收到客户端请求request'、'响应客户端请求response'、'连接错误'等各种事件。
前端_AWhile
2019/08/29
7450
Django2.0中文(会话、用户、注册)
//cookie不安全 1、读写cookie: request.COOKIES def show_color(request): if "favorite_color" in request.COOKIES: return HttpResponse("Your favorite color is %s" % request.COOKIES["favorite_color"]) else: return HttpResponse("You don't have a favorite color.")
用户5760343
2022/05/14
5030
Django2.0中文(会话、用户、注册)
PHP会话(Session)实现用户登陆功能
对比起 Cookie,Session 是存储在服务器端的会话,相对安全,并且不像 Cookie 那样有存储长度限制,本文简单介绍 Session 的使用。 由于 Session 是以文本文件形式存储在服务器端的,所以不怕客户端修改 Session 内容。实际上在服务器端的 Session 文件,PHP 自动修改 Session 文件的权限,只保留了系统读和写权限,而且不能通过 ftp 修改,所以安全得多。 对于 Cookie 来说,假设我们要验证用户是否登陆,就必须在 Cookie 中保存用户名和密码(可能是 md5 加密后字符串),并在每次请求页面的时候进行验证。如果用户名和密码存储在数据库,每次都要执行一次数据库查询,给数据库造成多余的负担。因为我们并不能 只做一次验证。为什么呢?因为客户端 Cookie 中的信息是有可能被修改的。假如你存储 $admin 变量来表示用户是否登陆,$admin 为 true 的时候表示登陆,为 false 的时候表示未登录,在第一次通过验证后将 $admin 等于 true 存储在 Cookie,下次就不用验证了,这样对么?错了,假如有人伪造一个值为 true 的 $admin 变量那不是就立即取的了管理权限么?非常的不安全。 而 Session 就不同了,Session 是存储在服务器端的,远程用户没办法修改 Session 文件的内容,因此我们可以单纯存储一个 $admin 变量来判断是否登陆,首次验证通过后设置 $admin 值为 true,以后判断该值是否为 true,假如不是,转入登陆界面,这样就可以减少很多数据库操作了。而且可以减少每次为了验证 Cookie 而传递密码的不安全性了(Session 验证只需要传递一次,假如你没有使用 SSL 安全协议的话)。即使密码进行了 md5 加密,也是很容易被截获的。 当然使用 Session 还有很多优点,比如控制容易,可以按照用户自定义存储等(存储于数据库)。我这里就不多说了。 Session 在 php.ini 是否需要设置呢?一般不需要的,因为并不是每个人都有修改 php.ini 的权限,默认 Session 的存放路径是服务器的系统临时文件夹,我们可以自定义存放在自己的文件夹里,这个稍后我会介绍。 开始介绍如何创建 Session。非常简单,真的。 启动 Session 会话,并创建一个 $admin 变量:
smy
2018/12/24
2.3K0
处理高并发的一般思路
今天看见有人聊目前系统有2亿的PV,该如何优化?当我看到这个话题的时候,突然在想自己工作中也遇到了不少高并发的场景了,所以即兴发挥,在这里简单总结和分享下服务端相关,欢迎指正和补充。
用户1093396
2020/10/29
5300
处理高并发的一般思路
NodeJs 获取 Git 用户和邮箱信息
获取 git config 的路径,一种是项目单独配置的,一种是全局配置的 'use strict'; const fs = require('fs'); const os = require('os'); const path = require('path'); module.exports = function (type) { let configPath = ''; const workDir = process.cwd(); if (type === 'global
子润先生
2021/06/28
2.2K0
NodeJs 获取 Git 用户和邮箱信息
获取 git config 的路径,一种是项目单独配置的,一种是全局配置的 'use strict'; const fs = require('fs'); const os = require('os'); const path = require('path'); module.exports = function (type) { let configPath = ''; const workDir = process.cwd(); if (type === 'global
上山打老虎了
2022/06/15
1.5K0
HanLP 自然语言处理 for nodejs
支持中文分词(N-最短路分词、CRF分词、索引分词、用户自定义词典、词性标注),命名实体识别(中国人名、音译人名、日本人名、地名、实体机构名识别),关键词提取,自动摘要,短语提取,拼音转换,简繁转换,文本推荐,依存句法分析(MaxEnt依存句法分析、CRF依存句法分析)
IT小白龙
2019/04/24
1.2K0
HanLP 自然语言处理 for nodejs
NodeJS错误处理最佳实践
NodeJS的错误处理让人痛苦,在很长的一段时间里,大量的错误被放任不管。但是要想建立一个健壮的Node.js程序就必须正确的处理这些错误,而且这并不难学。如果你实在没有耐心,那就直接绕过长篇大论跳到“总结”部分吧。
竹清
2018/08/31
1.6K0
NodeJS错误处理最佳实践
点击加载更多

相似问题

日志会话用户NodeJs NestJ

10

NodeJS -没有特快的会话处理

11

NodeJS注销所有用户会话

14

nodejs中的会话处理。CORS问题

11

使用mysql的nodejs会话处理程序

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文