• 华为service mesh使用指南-实现原理
    Mesher集成了注册发现、负载均衡、熔断降级、路由管理、调用链等微服务功能,通过mesher,微服务开发不再依赖开发框架,用户可选择自己习惯的语言,以极低成本进行新的微服务开发,也可以零成本将旧应用微服务化。拓扑cse mesher调用拓扑图来如下,调用关系是:client->server1->server2。我们以server1为例进行分析。server1细节放大后如图所示。Cse Mesher的功能由两个Proxy实现:1,出流量,经过正向代理proxy2,入流量,经过反向代理reverse_proxyProxyMesher接收用户发出的请求,解析用户想要访问的服务,并经负载均衡,路由策略等功能,将请求转发到具体的服务端。当用户将mesher设置为http代理后,用户发出的请求将被mesher接收并转发。例如,用户打算访问server2,rest接口为/hello,则用户的只需发送请求: http://server2/hello,mesher从url中解析出用户打算访问的服务为server2,并从注册中心查询server2的地址,将请求转发至server2。Reverse_proxyMesher接收外部请求,将请求转发至后端的service。工作流程mesher将自己的监听地址注册到注册中心。客户端mesher的Proxy接收用户请求,从注册中心查询服务端的地址,将请求转发至服务端(实际发送到了服务端mesher)。服务端mesher的reverse_proxy接收外部请求,将请求转发到自己的后端。配置若mesher监听在内部ip,如127.0.0.1:30101,mesher将只开启正向代理proxy。由于正向代理proxy只能向外转发请求,因此用户只能发出请求,无法接收请求,即只能作为consumer。cse:   protocols:     http:       listenAddress: 127.0.0.1:30101若mesher监听在外部ip,如192.168.1.1:30101,mesher将同时开启reverse_proxy/proxy,分别监听在192.168.1.1:30101/127.0.0.1:30101(相同端口,不同ip)。由于两个Proxy都开启,mesher可同时作为consumer/provider。cse:   protocols:     http:       listenAddress: 192.168.1.1:30101以上配置位于conf/chassis.yaml文件FAQ问:若要使用mesher,需要用户自己把mesher设置为http代理么?答:是的。用户程序需要将mesher设置为http代理。不同语言设置方法不同,具体的例子可参考《华为service mesh使用指南-快速入门(虚机,windows)》问:mesher接收外部请求,并将请求转发到后端的服务,但mesher怎么知道后端服务的地址?答:mesher读取环境变量SPECIFIC_ADDR作为后端服务地址,例如后端服务监听地址为127.0.0.1:80,则mesher启动前设置环境变量:export SPECIFIC_ADDR=127.0.0.1:80问:每个进程都要绑定一个mesher?答:每启动一个服务进程,就要绑定一个mesher。问:配置mesher时,什么时候监听在内部ip,什么时候监听在外部ip?答:mesher监听在内部ip时,只能作为consumer。监听在外部Ip时,可同时作为consumer/privider。建议都监听在外部ip。问:同一台机器上,能不能启动多个mesher?答:可以。但注意修改监听端口,避免端口冲突。问:mesher默认监听了那些地址?答:mesher默认监听了30101和30102端口,30101是代理/反向代理端口,30102是admin API端口。当修改mesher监听端口时,请避开这些端口。
  • [教程] 华为service mesh使用指南-快速入门(虚机,windows)
    本文内容:通过cse mesher,仅用一个rest server,一个client,创建微服务,并实现服务发现和调用。本文的参考意义:mesher支持多语言,本文提供的server/client,读者可根据开发习惯,使用任何语言实现。只要满足以下要求,任何语言均可使用cse mesher:1,server提供rest接口2,client设置http代理,同时请求url格式为:http://{serviceName}/api其他语言示例:PHPNode.js环境准备:1,一个华为云账号,及该账号的ak/sk,请参考这里。2,一个rest server,提供"/hello"接口。Go的示例:Go server:package main import (    "log"    "net/http" ) func hello(w http.ResponseWriter, r *http.Request) {    msg := "Hello, Mesher!"    log.Println(msg)    w.WriteHeader(http.StatusOK)    w.Write([]byte(msg + "\n")) } func main() {    http.DefaultServeMux.HandleFunc("/hello", hello)    err := http.ListenAndServe("127.0.0.1:80", http.DefaultServeMux)    if err != nil {       log.Fatal(err)    } }3,一个client。go和curl示例:Go client:package main import (    "io/ioutil"    "log"    "net/http"    "net/url" ) func main() {    proxy, _ := url.Parse("http://127.0.0.1:30101") //将mesher设置为http代理    c := http.Client{       Transport: &http.Transport{          Proxy: http.ProxyURL(proxy),       },    }    u := "http://myServer/hello" //访问myServer,使用服务名进行访问    req, err := http.NewRequest(http.MethodGet, u, nil)    if err != nil {       log.Fatal(err)    }    resp, err := c.Do(req)    if err != nil {       log.Fatal(err)    }    r, err := ioutil.ReadAll(resp.Body)    if err != nil {       log.Fatal(err)    }    log.Printf("Get response: %s", string(r)) }Curl client:curl -x http://127.0.0.1:30101  http://myServer/hello  # -x用于指定http代理备注:如何指定http代理,不同的语言,以及在不同的代码中,方法不同。部分语言的默认http client会自动识别环境变量“http_proxy”或“HTTP_PROXY”作为http代理。若无法自动识别这两个环境变量,读者可自行在代码中设置,如本文client示例。4,mesher软件包,从这里下载:mesher发布地址mesher复制两份,分别给server/client使用:网络拓扑: 操作步骤1,启动server端确认服务端是否启动:2,为server端绑定一个mesher2.1 进入server端mesher目录:cd myServer/mesher/2.2 在conf/microservice.yaml里配置server端服务名:APPLICATION_ID: mesher service_description:   name: myServer #服务名   version: 0.0.12.3 在conf/auth.yaml里配置aksk:cse:   credentials:     accessKey: ***     secretKey: ***     project:2.4 在conf/chassis.yaml里配置mesher监听地址:cse:   protocols:     http:       listenAddress: 192.168.1.22:30111 #监听地址,填外部ip注意:作为服务提供者(服务端),请监听在外部ip。2.5 为mesher设置环境变量SPECIFIC_ADDRexport SPECIFIC_ADDR=127.0.0.1:80 #用于设置mesher的后端服务地址,即我的go server监听地址2.6 启动mesher./mesher2.7 确认mesher是否启动成功:mesher成功为后端进行代理(注意:此处的请求是发送至mesher):网络拓扑的右侧已经ok2.8 登录华为云CSE服务治理界面,可以看到mesher已经为我们注册了一个微服务:3,为client端绑定一个mesher3.1 进入client端mesher目录cd myClient/mesher/3.2 在conf/microservice.yaml里配置client端服务名:APPLICATION_ID: mesher service_description:   name: myClient #服务名   version: 0.0.13.3 在conf/auth.yaml里配置aksk:cse:   credentials:     accessKey: ***     secretKey: ***     project:3.4 在conf/chassis.yaml里配置mesher监听地址:cse:   protocols:     http:       listenAddress: 192.168.1.22:30101 #监听地址,填外部ip3.5 启动mesher./mesher注意:mesher启动后实际监听两个地址:在设置http代理时,只能设置127.0.0.1:30101,不可以设置192.168.1.22:30101即http proxy必须设置为:http://127.0.0.1:{meshPort}3.6 登录华为云CSE服务治理界面,可以看到mesher已经为我们注册了两个微服务:4,启动client端curl client:go client:调用成功!5,登录华为云CSE服务治理界面,可以看到两个微服务产生调用关系调用结果与网络拓扑对应关系:
  • [教程] 华为service mesh使用指南-快速入门(虚机,windows)
    本文内容:通过cse mesher,仅用一个rest server,一个client,创建微服务,并实现服务发现和调用。本文的参考意义:由于mesher与语言无关,作者在本文中提供的server/client,读者可以根据自己的开发习惯,使用任何语言实现。mesher仅要求:1,server端提供一个rest接口2,client端设置http代理3,client端请求url格式为:http://{serviceName}/api只要满足上述条件,任何语言都可以使用service mesh开发微服务。环境准备:1,一个华为云账号,及该账号的ak/sk,请参考这里。2,一个rest server,提供"/hello"接口。Go的示例:Go server:package main import (    "log"    "net/http" ) func hello(w http.ResponseWriter, r *http.Request) {    msg := "Hello, Mesher!"    log.Println(msg)    w.WriteHeader(http.StatusOK)    w.Write([]byte(msg + "\n")) } func main() {    http.DefaultServeMux.HandleFunc("/hello", hello)    http.ListenAndServe("127.0.0.1:80", http.DefaultServeMux) }3,一个client。go和curl示例:Go client:package main import (    "io/ioutil"    "log"    "net/http"    "net/url" ) func main() {    proxy, _ := url.Parse("http://127.0.0.1:30101") //将mesher设置为http代理    c := http.Client{       Transport: &http.Transport{Proxy: http.ProxyURL(proxy)},    }    u := "http://myServer/hello" //访问myServer,使用服务名进行访问    req, err := http.NewRequest(http.MethodGet, u, nil)    if err != nil {       log.Fatal(err)    }    resp, err := c.Do(req)    if err != nil {       log.Fatal(err)    }    r, err := ioutil.ReadAll(resp.Body)    if err != nil {       log.Fatal(err)    }    log.Printf("Get response: %s", string(r)) }Curl client:curl -x http://127.0.0.1:30101  http://myServer/hello  # -x用于指定http代理备注:如何指定http代理,不同的语言,以及在不同的代码中,方法不同。部分语言的默认http client会自动识别环境变量“http_proxy”或“HTTP_PROXY”作为http代理。若无法自动识别这两个环境变量,读者可自行在代码中设置,如本文client示例。4,mesher软件包,从这里下载:mesher发布地址mesher复制两份,分别给server/client使用:网络拓扑: 操作步骤1,启动server端确认服务端是否启动:2,为server端绑定一个mesher2.1 进入server端mesher目录:cd myServer/mesher/2.2 在conf/microservice.yaml里配置server端服务名:## microservice property APPLICATION_ID: mesher service_description:   name: myServer #服务名   version: 0.0.1   environment:  #microservice environment   properties:     allowCrossApp: false #whether to allow calls across applications2.3 在conf/auth.yaml里配置aksk:cse:   credentials:     accessKey: ***     secretKey: ***     project:2.4 在conf/chassis.yaml里配置mesher监听地址:cse:   protocols:     http:       listenAddress: 192.168.1.22:30111 #监听地址注意:请配置外部ip地址2.5 为mesher设置环境变量SPECIFIC_ADDRexport SPECIFIC_ADDR=127.0.0.1:80 #用于设置mesher的后端服务地址,即我的go server监听地址2.6 启动mesher./mesher2.7 确认mesher是否启动成功:mesher成功为后端进行代理(注意:此处的请求是发送至mesher):网络拓扑的右侧已经ok2.8 登录华为云CSE服务治理界面,可以看到mesher已经为我们注册了一个微服务:3,为client端绑定一个mesher3.1 进入client端mesher目录cd myClient/mesher/3.2 在conf/microservice.yaml里配置server端服务名:## microservice property APPLICATION_ID: mesher service_description:   name: myClient #服务名   version: 0.0.1   environment:  #microservice environment   properties:     allowCrossApp: false #whether to allow calls across applications3.3 在conf/auth.yaml里配置aksk:cse:   credentials:     accessKey: ***     secretKey: ***     project:3.4 在conf/chassis.yaml里配置mesher监听地址:cse:   protocols:     http:       listenAddress: 192.168.1.22:30101 #监听地址3.5 启动mesher./mesher注意:mesher启动后实际监听两个地址:在设置http代理时,只能设置127.0.0.1:30101,不可以设置192.168.1.22:30101即http proxy必须设置为:http://127.0.0.1:{meshPort}3.6 登录华为云CSE服务治理界面,可以看到mesher已经为我们注册了两个微服务:4,启动client端curl client:go client:调用成功!5,登录华为云CSE服务治理界面,可以看到两个微服务产生调用关系调用结果与网络拓扑对应关系:
  • [技术干货] 如何在返回值中包含HTTP头信息
    业务需要在响应消息中返回HTTP头,如何操作?可以使用Response+@ApiResponse来定义返回的Header。示例代码参考:https://github.com/apache/incubator-servicecomb-java-chassis/blob/master/demo/demo-jaxrs/jaxrs-server/src/main/java/org/apache/servicecomb/demo/jaxrs/server/multiErrorCode/MultiErrorCodeService.java
  • [技术干货] servicecomb启动报错An exceptionCaught() event was fired
    本地使用servicecomb开发微服务报错,错误日志如下[2018-02-24 15:17:24,622/GMT+08:00][transport-vert.x-eventloop-thread-2][WARN]An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. io.netty.util.internal.logging.Slf4JLogger.warn(Slf4JLogger.java:151) io.netty.handler.codec.DecoderException: io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: 474554202f20485454502f312e310d0a486f73743a206c6f63616c686f73743a383038300d0a436f6e6e656374696f6e3a206b6565702d616c6976650d0a557067726164652d496e7365637572652d52657175657374733a20310d0a557365722d4167656e743a204d6f7a696c6c612f352e30202857696e646f7773204e5420362e313b2057696e36343b2078363429204170706c655765624b69742f3533372e333620284b48544d4c2c206c696b65204765636b6f29204368726f6d652f36342e302e333238322e313637205361666172692f3533372e33360d0a4163636570743a20746578742f68746d6c2c6170706c69636174696f6e2f7868746d6c2b786d6c2c6170706c69636174696f6e2f786d6c3b713d302e392c696d6167652f776562702c696d6167652f61706e672c2a2f2a3b713d302e380d0a4163636570742d456e636f64696e673a20677a69702c206465666c6174652c2062720d0a4163636570742d4c616e67756167653a207a682d434e2c7a683b713d302e392c656e3b713d302e380d0a0d0a at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:459) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1359) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:935) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:138) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) at java.lang.Thread.run(Thread.java:745) Caused by: io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: 474554202f20485454502f312e310d0a486f73743a206c6f63616c686f73743a383038300d0a436f6e6e656374696f6e3a206b6565702d616c6976650d0a557067726164652d496e7365637572652d52657175657374733a20310d0a557365722d4167656e743a204d6f7a696c6c612f352e30202857696e646f7773204e5420362e313b2057696e36343b2078363429204170706c655765624b69742f3533372e333620284b48544d4c2c206c696b65204765636b6f29204368726f6d652f36342e302e333238322e313637205361666172692f3533372e33360d0a4163636570743a20746578742f68746d6c2c6170706c69636174696f6e2f7868746d6c2b786d6c2c6170706c69636174696f6e2f786d6c3b713d302e392c696d6167652f776562702c696d6167652f61706e672c2a2f2a3b713d302e380d0a4163636570742d456e636f64696e673a20677a69702c206465666c6174652c2062720d0a4163636570742d4c616e67756167653a207a682d434e2c7a683b713d302e392c656e3b713d302e380d0a0d0a at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1137) at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1193) at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489) at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428) ... 15 more【根因】出现此错误一是因为https调用http或者http调用https导致,但是最终定位是因为microserivce.yaml文件不满足yaml文件规范导致!BTW???servicecomb:  service:    registry:      address: http://127.0.0.1:30100  rest:    address: 0.0.0.0:8088  references:    codefirst:      version-rule: 0.0.1servicecomb:  fallback:    Consumer:      enabled: false查看org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig.getIpPort()方法,如下  public ArrayList<IpPort> getIpPort() {     DynamicStringProperty property =         DynamicPropertyFactory.getInstance()             .getStringProperty("servicecomb.service.registry.address", "https://127.0.0.1:30100");     List<String> uriList = Arrays.asList(property.get().split(","));     ArrayList<IpPort> ipPortList = new ArrayList<>();     uriList.forEach(anUriList -> {       try {         URI uri = new URI(anUriList.trim());         this.ssl = "https".equals(uri.getScheme());         ipPortList.add(NetUtils.parseIpPort(uri.getScheme(), uri.getAuthority()));       } catch (Exception e) {         LOGGER.error("servicecomb.service.registry.address invalid : {}", anUriList, e);       }     });     return ipPortList;   }因为yaml文件不满足规范,servicecomb使用默认配置https://127.0.0.1:30100,而我使用的是本地服务中心。所以报错
  • 【bug定位】servicecomb启动报错,An exceptionCaught() event was fired。。。
    本地使用servicecomb开发微服务报错,错误日志如下[2018-02-24 15:17:24,622/GMT+08:00][transport-vert.x-eventloop-thread-2][WARN]An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception. io.netty.util.internal.logging.Slf4JLogger.warn(Slf4JLogger.java:151) io.netty.handler.codec.DecoderException: io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: 474554202f20485454502f312e310d0a486f73743a206c6f63616c686f73743a383038300d0a436f6e6e656374696f6e3a206b6565702d616c6976650d0a557067726164652d496e7365637572652d52657175657374733a20310d0a557365722d4167656e743a204d6f7a696c6c612f352e30202857696e646f7773204e5420362e313b2057696e36343b2078363429204170706c655765624b69742f3533372e333620284b48544d4c2c206c696b65204765636b6f29204368726f6d652f36342e302e333238322e313637205361666172692f3533372e33360d0a4163636570743a20746578742f68746d6c2c6170706c69636174696f6e2f7868746d6c2b786d6c2c6170706c69636174696f6e2f786d6c3b713d302e392c696d6167652f776562702c696d6167652f61706e672c2a2f2a3b713d302e380d0a4163636570742d456e636f64696e673a20677a69702c206465666c6174652c2062720d0a4163636570742d4c616e67756167653a207a682d434e2c7a683b713d302e392c656e3b713d302e380d0a0d0a at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:459) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:265) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:340) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead(DefaultChannelPipeline.java:1359) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:362) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:348) at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:935) at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:138) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:645) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:580) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:497) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:459) at io.netty.util.concurrent.SingleThreadEventExecutor$5.run(SingleThreadEventExecutor.java:858) at java.lang.Thread.run(Thread.java:745) Caused by: io.netty.handler.ssl.NotSslRecordException: not an SSL/TLS record: 474554202f20485454502f312e310d0a486f73743a206c6f63616c686f73743a383038300d0a436f6e6e656374696f6e3a206b6565702d616c6976650d0a557067726164652d496e7365637572652d52657175657374733a20310d0a557365722d4167656e743a204d6f7a696c6c612f352e30202857696e646f7773204e5420362e313b2057696e36343b2078363429204170706c655765624b69742f3533372e333620284b48544d4c2c206c696b65204765636b6f29204368726f6d652f36342e302e333238322e313637205361666172692f3533372e33360d0a4163636570743a20746578742f68746d6c2c6170706c69636174696f6e2f7868746d6c2b786d6c2c6170706c69636174696f6e2f786d6c3b713d302e392c696d6167652f776562702c696d6167652f61706e672c2a2f2a3b713d302e380d0a4163636570742d456e636f64696e673a20677a69702c206465666c6174652c2062720d0a4163636570742d4c616e67756167653a207a682d434e2c7a683b713d302e392c656e3b713d302e380d0a0d0a at io.netty.handler.ssl.SslHandler.decodeJdkCompatible(SslHandler.java:1137) at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1193) at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:489) at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:428) ... 15 more【根因】出现此错误一是因为https调用http或者http调用https导致,但是最终定位是因为microserivce.yaml文件不满足yaml文件规范导致!BTW???servicecomb:  service:    registry:      address: http://127.0.0.1:30100  rest:    address: 0.0.0.0:8088  references:    codefirst:      version-rule: 0.0.1servicecomb:  fallback:    Consumer:      enabled: false查看org.apache.servicecomb.serviceregistry.config.ServiceRegistryConfig.getIpPort()方法,如下  public ArrayList<IpPort> getIpPort() {     DynamicStringProperty property =         DynamicPropertyFactory.getInstance()             .getStringProperty("servicecomb.service.registry.address", "https://127.0.0.1:30100");     List<String> uriList = Arrays.asList(property.get().split(","));     ArrayList<IpPort> ipPortList = new ArrayList<>();     uriList.forEach(anUriList -> {       try {         URI uri = new URI(anUriList.trim());         this.ssl = "https".equals(uri.getScheme());         ipPortList.add(NetUtils.parseIpPort(uri.getScheme(), uri.getAuthority()));       } catch (Exception e) {         LOGGER.error("servicecomb.service.registry.address invalid : {}", anUriList, e);       }     });     return ipPortList;   }因为yaml文件不满足规范,servicecomb使用默认配置https://127.0.0.1:30100,而我使用的是本地服务中心。所以报错
  • [技术干货] 如何定制HTTP返回错误码和如何定制590返回500
    业务如果需要处理未知异常,并给前台返回合理的错误消息,可以通过扩展实现ExceptionToResponseConverter来实现。 DefaultExceptionToResponseConverter是一个默认的实现,通过覆盖默认的实现(实现类order大于这里的缺省值),即可实现覆盖590,而返回500. 扩展ExceptionToResponseConverter的一个示例,可以参考对于参数建议错误码的开发例子:https://docs.servicecomb.io/java-chassis/zh_CN/build-provider/configuration/parameter-validator.html
  • [问题求助] 3月15日晚20:00点直播预告:使用Apache SkyWalking APM 监控 Apache ServiceComb
    12039 参与方式: 1 扫上图二维**名 ,并于周四晚 20:00 扫码观看 2 PC端通过网页报名和观看: http://www.itdks.com/liveevent/detail/10301 所有教程预告+材料汇总请移步:干货别错过!每周专家大咖直播+教程汇总
  • 【求助】 配置中心拉取配置时 http返回401 Unauthorized
    ak/sk 配置正常 之前还可以,改了些东西,现在出现configcenter-source/configcentersource.go:200","msg":"401 Unauthorized" 有知道原因的么。
  • [视频点播] HTTP流媒体播放技术发展以及nginx点播源站
    本帖最后由 leewei 于 2018-3-2 14:51 编辑互联网多媒体内容传输从大方向上可以分为下载传输和流式传输,而流式传输又可以分为顺序流式传输和实时流式传输,换句话来说就是点播(Video on Demand)和直播(Live Streaming),顾名思义,前者的媒体内容是提前存储在服务器上供客户端请求播放,而后者是实时产生并分发给客户端播放。   本文主要是基于HTTP的流媒体点播技术入门,讲述了一些基本的概念以及这一技术的变革演进。   互联网上传播音视频内容最早从上世纪90年代开始,RTP等专有协议的提出就是定义音视频的包格式以获得更低的网络传递开销。不过现如今的互联网世界,CDN扮演着非常重要的角色,而绝大部分CDN厂商是不支持RTP等协议的。基于HTTP的流媒体点播技术则占据着主流,其有几点优势:1、防火墙友好;2、客户端控制媒体流的访问,服务端不需要为每一个客户端连接维护媒体session状态;3、采用标准的HTTP服务器即可,支撑大规模客户端访问不需要额外的服务器技术资源开销,最重要的就是CDN技术的良好支持优化。   HTTP流媒体技术的变革大致经过了以下四个阶段:   最初,我们只能先下载完整视频文件到本地磁盘后,然后才能播放观赏。这意味着你必须等待视频下载操作的完成,严格来讲,根据我们第一段的划分,这不能称作为流媒体传输,不过我们还是列出来,以作对比。    在上面简单下载文件的基础上,一个明显的提升就是渐进式下载技术。这种情况下不需要完整下载视频文件,可以边下载边播放,这就要求视频的元数据信息得放在视频文件的开头。但是,我们只能在已经下载的那一部分自由拖拽播放,而未下载的部分是不能播放的。   在渐进式下载的基础上,pseudo-streaming(伪流)出现了,其增强了seek播放功能,也就是支持直接切到未下载的地方进行观看,所以也可以称之为渐进式播放。    其实,到pseudo-streaming 这一步,流媒体播放的技术已经很成熟了,而且目前绝大多数的视频网站都是这种技术,比如Youtube、优酷、腾讯视频等。如果,要在这个基础上再一步的优化,可以从哪些方面呢?比较容易想到的就是带宽优化,能够链路感知,这就是下面的自适应比特率流。其原理就是,同一视频内容会有不同的码率版本,客户端播放器会动态地根据网络质量切换请求带宽匹配的的视频片段。    自适应码率流媒体技术,业内比较常见的实现是Apple的HTTP Live Streaming (HLS)以及Adobe的HTTP Dynamic Streaming (HDS),下图简单展示了HLS的文件结构,可以看到master playlist包含了两种不同码率的播放列表,当然如果你只有一种版本,那么就不需要master playlist了。基于HTTP的自适应码率流媒体是有国际标准的,那就是3GPP组织和MPEG小组所提出的MPEG-DASH(Dynamic Adaptive Streaming over HTTP)。    最后,我们来说说一个简单的点播流媒体服务器是怎么工作的。   目前,很常见的一种搭建方式就是基于nginx,而nginx本身对音视频媒体的处理就有一定的支持,官方就有flv和mp4的插件,即ngx_http_flv_module和ngx_http_mp4_module。前者支持以字节偏移的渐进式seek播放,后者支持以时间偏移的渐进式seek播放。   要想达到这种渐进式播放的目的,大部分情况下,我们是要对服务端的媒体文件进行一定的处理的。首先播放之前,服务端需要先返回一定的视频元数据信息,其次我们需要知道媒体时间和媒体数据的映射关系。为什么呢?   目前大部分的视频编码都采用H264标准,而H264的不同视频帧采用了不同的压缩编码方式,其中I帧的作用很大,其通常是每个 GOP(Group of Picture)的第一个帧,我们简单点说,I帧依靠自身就可以解码出完整图像,而其后面帧的解码则需要依赖I帧,这意味着什么?   是的,这决定了我们在拖拽播放的时候,播放器会seek到最近的I帧处,所以有时候会有一个现象,就是你拖到一个精确的时间点,但是播放器却在另一个靠近的时间点开始播放,这就是因为那个时间点是I帧所在之处。   播放器的seek播放通常是让用户选择时间偏移,而服务端最终对文件的请求处理只能是字节偏移,所以问题来了,我们要有一个时间偏移和字节偏移的映射表,严格一点说,是每一个I帧的时间偏移与字节偏移映射。   问题又来了,这个映射是放在客户端还是服务端处理呢?当然是都可以。如果客户端发出字节偏移请求,那么服务端就很轻松,只需要提供HTTP range访问的功能,但是client端需要提前知道时间与字节的映射关系,比如flv格式的metadata就提供了这个信息,有的flv文件没有加入metadata,这时候就需要用相应的flv工具(比如flvmeta)去处理成这样的格式,这样客户端的播放器就可以直接发送字节偏移量了。MP4则不需要这么处理,因为MP4格式本身就要求带这样的信息,其记录metadata的Movie Box (moov)中的Media Information Box (minf)就存储了媒体时间和媒体数据的映射关系。如果客户端只发出时间请求,那么服务端就得将时间偏移请求转换为字节偏移请求,然后处理并响应请求。
  • 使用ServiceComb-javachassis如何在handler或者业务代码中取到HTTP header
    目前java-chassis可以在Handler中通过Invocation获取到调用必要的信息,从而完成打点治理等。在和第三方对接或者做认证鉴权的时候,需要在handler获取HTTP header,如果这些header信息在REST接口没声明,那么Handler就无法获取到。
  • [上云精品] 【沃通WoTrus】2018年7月,Chrome 68将所有HTTP站点标记“不安全”
    10829 2018年2月8日,谷歌安全博客发布公告:从2018年7月Chrome 68版本开始,将所有HTTP页面标记“不安全”。10830 谷歌强推HTTPS加密,取得惊人进展过去几年,谷歌一直通过大力倡导网站采用HTTPS加密,推动互联网迈向更安全的网络环境。2017年谷歌逐渐加大力度,通过将更多HTTP页面标记“不安全”来帮助用户了解HTTP站点的安全风险。·2017年1月(Chrome56)开始,正式将某些HTTP页面标记“不安全”,比如含密码或信用卡信息传输的HTTP页面;·2017年10月(Chrome 62)开始,所有需要输入数据的HTTP页面以及“隐身模式”下的所有HTTP页面都将显示“不安全”警告; 2017年的措施带来了惊人的进展,根据谷歌发布的数据显示:·安卓和Windows上,超过68%的Chrome流量已经受到加密保护·Chrome OS和MAC上,超过78%的Chrome流量已经受到加密保护·排名前100的网站中,81个网站已经默认使用HTTPS加密 而此次发布的公告,将进一步推动全球互联网迈向全网HTTPS。目前,Chrome仍显示中性的圆圈“i”标识,未来可能进一步加强警告,最终目标是对HTTP页面显示红色三角警告。10831 网站没有升级HTTPS,会怎么样?NetMarketShare公布的2017年8月浏览器市场份额数据显示,Chrome依然是最热门的桌面浏览器,市场占比接近60%。如果您的网站没有升级HTTPS加密,Chrome将标记您的网站“不安全”,警告用户谨慎访问,这可能造成大量用户流失。在Chrome浏览器的引领下,其他浏览器也在逐步实施弃用HTTP的计划,FireFox准备将所有HTTP页面标记“不安全”,Safari也计划添加HTTP安全警告,HTTP页面的警告范围将越来越大。 10832 此外,安全访问已经成为互联网标准,现代互联网技术都将围绕着更为安全的HTTPS加密而设计的。一些新功能和标准已经被设计为从发布之初就使用HTTPS加密,例如:下一代HTTP/2协议、浏览器最新功能(地理定位、用户媒体等)等等都仅支持HTTPS加密。网站没有升级HTTPS加密,那这些高级功能都和你无缘了。 升级HTTPS加密,应该做些什么?您需要立即为网站制定HTTPS加密升级计划,部署SSL证书让您的网站迁移到HTTPS。在申请SSL证书之前,需要梳理一下有多少网站需要HTTPS加密保护,根据您的业务需求选择合适的SSL证书进行HTTPS改造和性能优化。无论采用何种方式,您需要在7月份之前获取SSL证书,避免您的网站被贴上“不安全”的警告标签。沃通CA在华为云市场提供“沃通免费SSL证书”,全球信任,支持所有浏览器!帮助用户零成本部署HTTPS加密,网站升级HTTPS加密的过程中遇到任何问题,欢迎咨询沃通CA(www.wosign.com)。 10833
  • 【沃通WoTrus】SSL证书保护云安全,数据不再“裸奔”
    本帖最后由 沃通WoTrus 于 2018-1-12 16:29 编辑很多互联网用户可能遇到过这样的问题:·正常访问网站,页面突然弹出各种“屠龙宝刀点击就送”、“充值XX元就可获得流量大礼包”之类的弹窗广告;·访问的域名没有错,却连接到一个虚假网站上;·网站账号密码、访问轨迹、隐私数据泄露,被不法分子贩卖;…… 互联网用户习惯了在浏览器地址里输入http:// 格式的网址,但是却并不知道其实HTTP是非常不安全的明文传输协议,HTTP明文协议的缺陷,是造成上述安全问题的重要原因。通过HTTP明文协议传输的数据,时刻处在被窃听、篡改、冒充的风险中。沃通SSL证书为服务器、云主机提供传输加密和可信认证方案,加密传输数据、验证服务器身份,保护数据机密性、完整性及服务器身份真实性,有效解决数据泄露、数据篡改、流量劫持和虚假服务器攻击等安全问题,确保客户端和服务器之间的信息交互始终安全。为什么需要部署SSL证书? 目前互联网常用的HTTP协议不提供加密和校验机制,所有通信数据都在网络中明文“裸奔”;HTTP协议无法验证通信方身份,任何人都可以伪造虚假服务器欺骗用户,实现“网站欺诈”。HTTPS协议是安全的加密传输协议,在HTTP的基础上加入了SSL/TLS协议,具有服务器身份验证、数据加密和完整性校验的功能。 沃通SSL证书为网站提供HTTPS加密升级方案,服务器部署沃通SSL证书可激活SSL/TLS协议,实现HTTPS加密访问,为客户端和服务器端之间建立“SSL加密通道”,防劫持、防监听、防篡改,保护网站数据安全;并通过SSL证书验证服务器身份,确保数据传输到正确的通信方,防止虚假服务器攻击。 沃通SSL证书上线华为云市场 近日,沃通SSL证书系列产品正式上线华为云市场,沃通SSL证书联合华为云市场提供一站式安全产品采购方案,快速颁发证书、灵活管理证书资源,携手共建安全便捷的云服务生态。 沃通为华为云市场用户提供的SSL证书服务具有以下优势: ·SSL产品全球信任沃通提供的SSL证书产品全球信任,具备广泛兼容性,支持所有浏览器和移动终端,支持Java和老设备;提供不同认证级别的SSL证书,支持单域名、多域名和通配域名,满足不同的用户需求,应对各类行业应用场景。·证书管理安全便捷沃通为华为云用户提供专属的证书管理后台,支持证书申请、签发、重新颁发、吊销等全生命周期管理;系统接口采用HTTPS加密,保护用户数据安全。·专业团队全天候服务沃通官方服务支持团队提供7×24小时全天候服务,为华为云市场用户提供SSL证书产品咨询和售后服务,无论节假日或深夜都能及时响应用户需求。登录华为云市场,一站获取SSL证书服务现在登录华为云市场,搜索“沃通SSL”,或选择“云市场—安全市场—网络安全”即可查看沃通SSL证书产品详情或立即下单购买,轻松一站式获取SSL证书产品和优质服务。1、在线申请沃通SSL证书进入华为云市场,选购所需的沃通SSL证书产品,登录“沃通-华为云SSL数字证书管理系统”完善资料并完成身份验证,即可获取SSL证书。 2、部署SSL证书成功申请到SSL证书后,用户会得到一个含密码的压缩包文件,里面包含适用多种服务器类型的证书文件,根据自己的服务器类型选择对应的证书文件,依照对应的服务器证书部署指南,将SSL证书文件部署到服务器上。 3、在线测试在浏览器或相应客户端通过https://访问已部署SSL证书的站点,测试SSL证书是否安装成功。 关于沃通 沃通CA(https://www.wosign.com/)专注数字证书行业十余年,是工信部许可的电子认证服务机构,致力于PKI技术研究和产品应用,为构建安全可信的互联网环境,持续提供全球信任的SSL证书、代码签名证书等数字证书产品,以及互联网安全应用产品。如果您希望了解更多关于HTTPS与SSL证书相关的信息,请联系沃通。
  • [技术干货] 使用华为对象存储是使用sdk好还是自己直接封装http请求?
    使用华为对象存储是使用sdk好还是自己直接封装http请求?
  • Pip工具安装配置教程
    本帖最后由 yd_35937100 于 2017-11-15 14:10 编辑pip是python的镜像包管理软件。故此安装pip之前,需要先安装成功python。若python已经安装成功,则直接安装pip即可。否则先行安装python。 windows系统安装python 1、python下载官网:https://www.python.org/downloads/ 2、查看python安装路径是否已经添加在系统变量path之中,方便直接在windows终端中输入python指令,使用python。 --> 打开windows终端,输入echo %Path% -->添加python路径。 计算机 -> 属性 -> 高级系统设置 -> 环境变量 -> 找到系统变量Path -> 将python的安装路径添加至该变量末尾即可(注意以英文分号为分隔符) 安装PIP 1、打开windows终端,直接输入指令pip。若系统不识别该指令,则代表没有安装成功。 2、安装pip Python 2 >=2.7.9 or Python 3 >=3.4的版本默认情况下,会安装好pip。下载get-pip.py文件https://bootstrap.pypa.io/get-pip.py 直接运行该python文件即可。 校验安装成功 直接在终端中输入Pip,若打印出pip的使用指南,则代表pip安装成功。 3、已经安装更新pip 直接在windows终端中运行pip install -U pip 4、卸载pip pip uninstall pip Linux系统 安装python linux下默认会安装python,终端直接输入python. 安装pip 1、查看pip是否已经安装 直接在终端中输入pip,查看系统是否已经安装pip。 2、安装pip centOS/REHEL yum install python-pip Debian/Ubuntu apt-getinstall python-pip
总条数:327 到第
上滑加载中