精华内容
下载资源
问答
  • spring-cloud-kubernetes官方demo运行实战

    万次阅读 2019-06-08 23:58:08
    spring-cloud-kubernetes是springcloud官方推出的开源项目,用于将Spring Cloud和Spring Boot应用运行在kubernetes环境,并且提供了通用的接口来调用kubernetes服务,今天就来初步体验一下。

    关于spring-cloud-kubernetes

    spring-cloud-kubernetes是springcloud官方推出的开源项目,用于将Spring Cloud和Spring Boot应用运行在kubernetes环境,并且提供了通用的接口来调用kubernetes服务,GitHub上官方地址是:https://github.com/spring-cloud/spring-cloud-kubernetes

    系列文章列表

    本文是《spring-cloud-kubernetes实战系列》的第一篇,全文链接如下:

    1. 《spring-cloud-kubernetes官方demo运行实战》
    2. 《你好spring-cloud-kubernetes》
    3. 《spring-cloud-kubernetes背后的三个关键知识点》
    4. 《spring-cloud-kubernetes的服务发现和轮询实战(含熔断)》
    5. 《spring-cloud-kubernetes与SpringCloud Gateway》
    6. 《spring-cloud-kubernetes与k8s的configmap》

    官方demo

    官方提供了简单的demo用于快速了解spring-cloud-kubernetes,我们就来一起将此demo源码编译构建,然后在kubernetes环境运行;

    环境信息

    本次实战的环境和版本信息如下:

    1. 操作系统:CentOS Linux release 7.6.1810
    2. minikube:1.1.1
    3. Java:1.8.0_191
    4. Maven:3.6.0
    5. fabric8-maven-plugin插件:3.5.37
    6. spring-cloud-kubernetes:1.0.1.RELEASE

    上面提到的linux、minikube、java、maven,请确保已全部准备好,关于linux环境下minikube的安装和启动请参考《Linux安装minikube指南 》

    下载源码

    官方demo包含在整个spring-cloud-kubernetes开源项目中,因此要下载整个开源项目,由于主干的提交一直很活跃,因此最好下载个release版本,我这里下载的是v1.0.1.RELEASE,如下图红框所示,地址是:https://github.com/spring-cloud/spring-cloud-kubernetes/releases
    在这里插入图片描述

    修改maven设置

    需要事先修改maven的设置,否则编译构建的时候会报错:

    1. 打开maven的配置文件settings.xml,完整路径是apache-maven-3.6.0/conf/settings.xm;
    2. 在settings.xml文件内,找到pluginGroups节点,在里面增加两行,修改完成后效果如下:
    <pluginGroups>
        <pluginGroup>io.fabric8</pluginGroup>
        <pluginGroup>org.springframework.boot</pluginGroup>
      </pluginGroups>
    
    1. 修改完毕保存退出,maven设置完成;

    如果您想了解该错误的细节,请参考文章《使用fabric8-maven-plugin插件的错误处理(No plugin found for prefix ‘fabric8’)》

    编译项目源码

    1. 将上图中的源码下载解压,得到一个新的文件夹spring-cloud-kubernetes-1.0.1.RELEASE
    2. 进入文件夹spring-cloud-kubernetes-1.0.1.RELEASE,执行命令mvn clean compile -U,完全编译整个工程,由于要下载大量依赖库所以较为耗时,我这里是二十分钟以上(这一步不是必须的,看个人爱好吧),构建通过后如下所示:
    [INFO] Reactor Summary for Spring Cloud Kubernetes 1.0.1.RELEASE:
    [INFO] 
    [INFO] Spring Cloud Kubernetes :: Dependencies ............ SUCCESS [  0.077 s]
    [INFO] Spring Cloud Kubernetes ............................ SUCCESS [  2.575 s]
    [INFO] Spring Cloud Kubernetes :: Core .................... SUCCESS [01:51 min]
    [INFO] Spring Cloud Kubernetes :: Config .................. SUCCESS [ 21.357 s]
    [INFO] Spring Cloud Kubernetes :: Discovery ............... SUCCESS [  6.473 s]
    [INFO] Spring Cloud Kubernetes :: Ribbon .................. SUCCESS [ 31.616 s]
    [INFO] Spring Cloud Kubernetes :: Starter ................. SUCCESS [  0.558 s]
    [INFO] Spring Cloud Kubernetes :: Starter :: Config ....... SUCCESS [  0.569 s]
    [INFO] Spring Cloud Kubernetes :: Starter :: Ribbon ....... SUCCESS [  0.595 s]
    [INFO] Spring Cloud Kubernetes :: Starter :: All .......... SUCCESS [  0.571 s]
    [INFO] Spring Cloud Kubernetes :: Examples ................ SUCCESS [  0.558 s]
    [INFO] Spring Cloud Kubernetes :: Examples :: Reload ConfigMap SUCCESS [  9.077 s]
    [INFO] Spring Cloud Kubernetes :: Examples :: Hello World . SUCCESS [  1.323 s]
    [INFO] Spring Cloud Kubernetes :: Leader .................. SUCCESS [  7.395 s]
    [INFO] Spring Cloud Kubernetes :: Examples :: Leader Election SUCCESS [  0.594 s]
    [INFO] Spring Cloud Kubernetes :: Istio ................... SUCCESS [ 12.788 s]
    [INFO] Spring Cloud Kubernetes :: Integration Tests ....... SUCCESS [  0.574 s]
    [INFO] Spring Cloud Kubernetes :: Integration Tests :: Simple Core SUCCESS [02:14 min]
    [INFO] Spring Cloud Kubernetes :: Integration Tests :: Simple Configmap SUCCESS [  0.646 s]
    [INFO] Spring Cloud Kubernetes :: Integration Tests :: Istio SUCCESS [  0.623 s]
    [INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Parent SUCCESS [  0.564 s]
    [INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Service A SUCCESS [  0.605 s]
    [INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Service B SUCCESS [  0.625 s]
    [INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Client SUCCESS [  0.608 s]
    [INFO] Spring Cloud Kubernetes :: Integration Tests :: Discovery Tests SUCCESS [  1.440 s]
    [INFO] Spring Cloud Kubernetes Docs ....................... SUCCESS [  0.583 s]
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  05:53 min
    [INFO] Finished at: 2019-06-08T19:32:19+08:00
    [INFO] ------------------------------------------------------------------------
    
    
    1. 进入目录spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example,这里面就是官方的入门demo,执行以下命令开始构建并且会部署到minikube:
    mvn clean package fabric8:deploy -Pkubernetes
    

    构建和部署完成后,控制台输出以下信息:

    ...
    [INFO] Installing /usr/local/work/demo/spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target/kubernetes-hello-world-1.0.1.RELEASE-sources.jar to /root/.m2/repository/org/springframework/cloud/kubernetes-hello-world/1.0.1.RELEASE/kubernetes-hello-world-1.0.1.RELEASE-sources.jar
    [INFO] 
    [INFO] <<< fabric8-maven-plugin:3.5.37:deploy (default-cli) < install @ kubernetes-hello-world <<<
    [INFO] 
    [INFO] 
    [INFO] --- fabric8-maven-plugin:3.5.37:deploy (default-cli) @ kubernetes-hello-world ---
    [INFO] F8: Using Kubernetes at https://192.168.121.133:8443/ in namespace default with manifest /usr/local/work/demo/spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target/classes/META-INF/fabric8/kubernetes.yml 
    [INFO] Using namespace: default
    [INFO] Creating a Service from kubernetes.yml namespace default name kubernetes-hello-world
    [INFO] Created Service: spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target/fabric8/applyJson/default/service-kubernetes-hello-world.json
    [INFO] Using namespace: default
    [INFO] Creating a Deployment from kubernetes.yml namespace default name kubernetes-hello-world
    [INFO] Created Deployment: spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target/fabric8/applyJson/default/deployment-kubernetes-hello-world.json
    [INFO] F8: HINT: Use the command `kubectl get pods -w` to watch your pods start up
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  16.047 s
    [INFO] Finished at: 2019-06-08T19:50:50+08:00
    [INFO] ------------------------------------------------------------------------
    
    1. 查看服务,已经创建了,类型是NodePort ,并且将8080端口映射到宿主机的30700端口,说明可以用http://宿主机IP:30700来访问此服务:
    [root@minikube kubernetes-hello-world-example]# kubectl get services
    NAME                     TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)          AGE
    kubernetes               ClusterIP   10.96.0.1        <none>        443/TCP          10h
    kubernetes-hello-world   NodePort    10.108.214.207   <none>        8080:30700/TCP   4m
    
    1. 查看部署,发现始终未能进入READY状态
    [root@minikube kubernetes-hello-world-example]# kubectl get deployments
    NAME                     READY   UP-TO-DATE   AVAILABLE   AGE
    kubernetes-hello-world   0/1     1            0           4m46s
    
    1. 查看pod,发现新建的pod始终未能进入READY状态
    [root@minikube kubernetes-hello-world-example]# kubectl get pods
    NAME                                      READY   STATUS    RESTARTS   AGE
    kubernetes-hello-world-7578f45c5d-hr4r7   0/1     Running   1          6m
    
    1. 从上面的信息可以看出,部署虽然已经完成,但是pod是不可用的,访问网页试试,如下图,果然无法访问:
      在这里插入图片描述

    检查问题

    1. 执行命令kubectl describe pod kubernetes-hello-world-7578f45c5d-hr4r7检查pod的具体情况,如下图红框所示,两个探针检查都失败了:
      在这里插入图片描述
    2. 再看看控制台输出的pod基本情况,里面有探针的信息,如下图所示,两个探针的地址都是/health
      在这里插入图片描述
    3. 打开demo的源码,如下所示,根本就没有路径为/health的服务:
    @RestController
    public class HelloController {
    
            private static final Log log = LogFactory.getLog(HelloController.class);
    
            @Autowired
            private DiscoveryClient discoveryClient;
    
            @RequestMapping("/")
            public String hello() {
                    return "Hello World";
            }
    
            @RequestMapping("/services")
            public List<String> services() {
                    return this.discoveryClient.getServices();
            }
    }
    

    现在真相大白了:部署到minikube上的pod,配置了探针地址是/health,但是服务中并没有此路径,因此探针检查一直无法通过;

    解决问题

    搞清楚问题之后就可以动手解决问题了,这里有两种解决方式:
    第一种,修改HelloController.java,增加一个方法,对应的地址是/health的服务;
    第二种,修改deployment的配置,将探针地址改为现有的服务,例如"/",这是个可用的服务;

    第一种方法很简单,留给读者您来完成吧,我们来试试第二种:

    1. 执行以下命令,开始编辑deployment:
    kubectl edit deployment kubernetes-hello-world
    
    1. 在编辑页面上找到两个探针的配置,都从"/health"改成"/",如下图两个红框所示:
      在这里插入图片描述
    2. 修改完毕后,像普通vim操作一样"wq"保存退出,配置会立即生效,稍等一会儿再看pod情况,发现pod的name已经变了,并且状态已经成为Ready,证明旧的pod已经销毁,新的pod被创建并且探针测试通过:
    [root@minikube examples]# kubectl get pods
    NAME                                      READY   STATUS    RESTARTS   AGE
    kubernetes-hello-world-6c5f75ff74-dnm2q   1/1     Running   0          15s
    
    1. 访问地址http://192.168.121.133:30700 ,服务正常(192.168.121.133是宿主机IP地址),如下图:
      在这里插入图片描述

    官方解释

    官方的demo无法在minikube上正常运行,还要我们自己去修改配置或者源码,官方的demo不应该会这样,在kubernetes-hello-world-example工程内的README.md文档中发现了对此问题的说明,如下图红框所示,fabric8的maven插件在生成探针配置的是时候配错了URL,因此官方建议我们去修改deployment的配置,将探针的地址从"/health"改为"/actuator/heath",这个问题已经被提交到了fabric8社区,并且贴出了链接:
    在这里插入图片描述

    权限问题

    刚才我们看过了HelloController.java的源码,里面还有个路径为"/services"的接口,在minikube环境下访问此接口可以成功返回,内容是当前minikube环境的服务信息,但是如果部署在正式的kubernetes环境,访问此接口会返回以下错误:

    Message: Forbidden!Configured service account doesn't have access. Service account may have been revoked. services is forbidden: User "system:serviceaccount:default:default" cannot list resource "services" in API group "" in the namespace "default"
    

    也就是说当前的system:serviceaccount账号是没有权限通过API server访问"services"资源的,此时最快的解决办法是提升账号权限:

    kubectl create clusterrolebinding permissive-binding \
      --clusterrole=cluster-admin \
      --user=admin \
      --user=kubelet \
      --group=system:serviceaccounts
    

    注意:以上办法只能用于开发和测试环境,不要用在生产环境,在生产环境应该参考Kubernetes的RBAC授权相关设置来处理。

    修改源码时遇到的错误怎么规避

    如果您想尝试修改demo的源码并且部署上去,在编译阶段可能遇到以下问题:

    [root@minikube kubernetes-hello-world-example]# mvn clean package fabric8:deploy -Pkubernetes
    [INFO] Scanning for projects...
    [INFO] 
    [INFO] ----------< org.springframework.cloud:kubernetes-hello-world >----------
    [INFO] Building Spring Cloud Kubernetes :: Examples :: Hello World 1.0.1.RELEASE
    [INFO] --------------------------------[ jar ]---------------------------------
    [INFO] 
    [INFO] --- maven-clean-plugin:2.5:clean (default-clean) @ kubernetes-hello-world ---
    [INFO] Deleting /usr/local/work/demo/spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/target
    [INFO] 
    [INFO] --- maven-checkstyle-plugin:3.0.0:check (checkstyle-validation) @ kubernetes-hello-world ---
    [INFO] 开始检查……
    [ERROR] /usr/local/work/demo/spring-cloud-kubernetes-1.0.1.RELEASE/spring-cloud-kubernetes-examples/kubernetes-hello-world-example/src/main/java/org/springframework/cloud/kubernetes/examples/HelloController.java:33: 当前行匹配非法表达式: 'Trailing whitespace'[Regexp]
    检查完成。
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD FAILURE
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time:  2.976 s
    [INFO] Finished at: 2019-06-08T22:15:37+08:00
    [INFO] ------------------------------------------------------------------------
    [ERROR] Failed to execute goal org.apache.maven.plugins:maven-checkstyle-plugin:3.0.0:check (checkstyle-validation) on project kubernetes-hello-world: Failed during checkstyle execution: There is 1 error reported by Checkstyle 8.12 with checkstyle.xml ruleset. -> [Help 1]
    [ERROR] 
    [ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
    [ERROR] Re-run Maven using the -X switch to enable full debug logging.
    [ERROR] 
    [ERROR] For more information about the errors and possible solutions, please read the following articles:
    [ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoExecutionException
    

    出现上述问题的原因是maven-checkstyle-plugin插件检查代码的style没有通过,我试过在mvn命令中添加skip参数,也试过在pom.xml中添加maven-checkstyle-plugin节点并且配置为skip,结果都没有用,最终用以下方法成功规避了此问题:

    1. 打开pom.xml文件;
    2. 找到节点properties(如果没有就创建),增加以下三个属性配置,这样配置的作用是在style检查失败、校验失败、单元测试代码检查失败这三种情况下,都不会导致整个maven构建的失败:
    <properties>
            <maven-checkstyle-plugin.failsOnError>false</maven-checkstyle-plugin.failsOnError>
            <maven-checkstyle-plugin.failsOnViolation>false</maven-checkstyle-plugin.failsOnViolation>
            <maven-checkstyle-plugin.includeTestSourceDirectory>false</maven-checkstyle-plugin.includeTestSourceDirectory></properties>
    

    至此,官方demo的部署和运行都完成了,对spring-cloud-kubernetes算是有了初步认识,接下来的实战中,我们一起去深入的了解spring-cloud-kubernetes,看看kubernetes上的springcloud应用怎么开发;

    问题处理

    感谢jason9211的提醒,如果读者您也遇到类似问题,请参考如下:

    如果在deploy时遇到 “the server could not find the requested resource”问题,
    建议把fabric8.maven.plugin的版本升级到4.2.0即可。 
    <fabric8.maven.plugin.version>4.2.0</fabric8.maven.plugin.version>
    

    欢迎关注我的公众号:程序员欣宸

    在这里插入图片描述

    展开全文
  • webRTC是直播的一个经典方案。服务器端有不少开源的软件,比如Janus。 本文介绍如何搭建Janus以及如何运行网页demo和android端Demo

    原文网址:https://blog.csdn.net/newchenxf/article/details/110451532
    转载请注明出处^^

    前言

    2020年,直播带货不要太火,直播的方案基于啥?相信webRTC方案有一席之地。还有虽然没爆发,但各大公司在做的云游戏,也很多是基于webRTC。

    webRTC服务器端最主要需要搭建2个东西,一个是STUN/TURN 服务器,一个是信令服务器。第一个好办,现成的coturn即可。甚至如果在内部局域网运行demo,还不需要这个。而信令服务器,可以自己裸搭建,也可以有封装的比较好的方案,比较出名的是Janus。

    关于Janus搭建,网上已经有一些文章,但是我参考搭建,就是跑不起来,遇到了不少坑,所以基于最新的Janus代码(2020-12),重新说明一下搭建流程。

    本文先介绍如何搭建Janus服务器(服务器使用Ubuntu 18),然后再介绍如何运行Demo,包括Android客户端和网页端。

    1. 搭建Janus服务器

    1.1 下载源码

    到github官网先瞅瞅:
    https://github.com/meetecho/janus-gateway

    README 安装步骤说的挺清楚,但是不是每一步都必须。

    1.2 安装Janus的依赖库

    部分直接命令行安装,部分通过源码安装。下面分情况说明。

    1.2.1 命令行安装

    sudo aptitude install libmicrohttpd-dev libjansson-dev \
    	libssl-dev libsrtp-dev libsofia-sip-ua-dev libglib2.0-dev \
    	libopus-dev libogg-dev libcurl4-openssl-dev liblua5.3-dev \
    	libconfig-dev pkg-config gengetopt libtool automake
    

    请注意安装结果,如果有某一个安装失败,又是官网要求必须装的,则需要人肉解决一下。我就遇到坑,libcurl4没装成功,后面demo死活运行失败,最后发现是这个没装来着。

    1.2.2 源码安装libnice

    libnice,这是一个建立ice连接必须的库。
    官网推荐的安装方法,依赖比较多,需要Python 3, Meson and Ninja

    git clone https://gitlab.freedesktop.org/libnice/libnice
    cd libnice
    meson --prefix=/usr build && ninja -C build && sudo ninja -C build install
    

    我是没安装成功,所以找了老版本,直接make,很快啊
    先打开这个地址:https://launchpad.net/ubuntu/+source/libnice/0.1.16-1
    下载libnice_0.1.16.orig.tar.gz
    然后解压,然后执行:

      ./configure && make && sudo make install
    

    1.2.3 源码安装libwebsocket

    WebSocket不是必须的,但是最好装一下,因为websocket也很常用,Demo也会用。

    git clone https://libwebsockets.org/repo/libwebsockets
    cd libwebsockets
    # If you want the stable version of libwebsockets, uncomment the next line
    # git checkout v3.2-stable
    mkdir build
    cd build
    # See https://github.com/meetecho/janus-gateway/issues/732 re: LWS_MAX_SMP
    cmake -DLWS_MAX_SMP=1 -DCMAKE_INSTALL_PREFIX:PATH=/usr -DCMAKE_C_FLAGS="-fpic" ..
    make && sudo make install
    

    如果安装失败,直接去libwebsockets github官网找一下原因。安装成功后,在编译 janus 时,janus 默认会增加对 WebSocket 的集成,或者通过增加编译参数 –enable-websockets 打开 WebSocket 开关。

    1.2.4 源码安装libsrtp

    这一个不是绝对必须的,因为前面命令行也安装了libsrtp-dev。事实上,运行起demo是没有问题的,如果你只跑demo,可以跳过。只不过,Janus官网建议,如果你的libsrtp版本低于1.5,建议升级到最新的,比如2.2,因为之前的版本可能有bug,会引入问题。所以如果是正儿八经运行,那就装最新的吧。

    那么,怎么看你装的是哪个版本?简单,执行:

    sudo apt-get install libsrtp-dev
    

    会提示已经按照过。我这确实是老版本。

    Reading package lists... Done
    Building dependency tree       
    Reading state information... Done
    Note, selecting 'libsrtp0-dev' instead of 'libsrtp-dev'
    libsrtp0-dev is already the newest version (1.4.5~20130609~dfsg-2ubuntu1).
    
    

    装新版本,官网也给出命令了:

    wget https://github.com/cisco/libsrtp/archive/v2.2.0.tar.gz
    tar xfv v2.2.0.tar.gz
    cd libsrtp-2.2.0
    ./configure --prefix=/usr --enable-openssl
    make shared_library && sudo make install
    

    更新到2.2后,不需要pkg-config来修改版本,因为这个库名字和老版本不一样,叫做libsrtp2,不会冲突。如果有libsrtp2,Janus会自动选这个库。

    1.2.5 源码安装usrsctp

    这个也是非必须,如果要起用Data Channel才需要,这个干麽用的?简单说,就是推拉流运行起来后,如果需要文本互相发送,会用到。比如你给主播发个消息啥的。
    要安装的话,命令如下。装好以后,编译janus会默认启用data channel。

    git clone https://github.com/sctplab/usrsctp
    cd usrsctp
    ./bootstrap
    ./configure --prefix=/usr --disable-programs --disable-inet --disable-inet6
    make && sudo make install
    

    1.3 编译Janus

    好了,依赖都准备好了,可以编译janus了。

    git clone https://github.com/meetecho/janus-gateway.git
    sh autogen.sh
    ./configure --prefix=/opt/janus --enable-websockets
    make
    sudo make install
    

    如果还想生成帮助文档,可以加一个–enable-docs,编译前,还需要装一下doxygen等辅助工具。

    aptitude install doxygen graphviz
    

    执行完configure,会打印janus的配置信息,我这打印如下:

    Compiler:                  gcc
    libsrtp version:           2.x
    SSL/crypto library:        OpenSSL
    DTLS set-timeout:          not available
    Mutex implementation:      GMutex (native futex on Linux)
    DataChannels support:      no
    Recordings post-processor: no
    TURN REST API client:      yes
    Doxygen documentation:     no
    Transports:
        REST (HTTP/HTTPS):     yes
        WebSockets:            yes
        RabbitMQ:              no
        MQTT:                  no
        Unix Sockets:          yes
        Nanomsg:               no
    Plugins:
        Echo Test:             yes
        Streaming:             yes
        Video Call:            yes
        SIP Gateway:           yes
        NoSIP (RTP Bridge):    yes
        Audio Bridge:          yes
        Video Room:            yes
        Voice Mail:            yes
        Record&Play:           yes
        Text Room:             yes
        Lua Interpreter:       no
        Duktape Interpreter:   no
    Event handlers:
        Sample event handler:  yes
        WebSocket ev. handler: yes
        RabbitMQ event handler:no
        MQTT event handler:    no
        Nanomsg event handler: no
        GELF event handler:    yes
    External loggers:
        JSON file logger:      no
    JavaScript modules:        no
    
    

    可以看到,没有配置Data Channel,这不影响Demo运行起来,但如果你需要消息通道,需要根据官网再安装一下依赖。

    1.4 运行Janus

    Janus运行需要参数配置,安装目录已经有配置的sample。
    目录在:/opt/janus/etc/janus/
    进入以后,发现有很多jcfg.sample文件,比如janus.jcfg.sample, janus.transport.websockets.jcfg.sample。把这些都复制成可被读取的文件。没错,是全部复制,有10来个,不要怕。
    例子

    sudo cp -rf janus.jcfg.sample janus.jcfg
    

    全部复制好了,接下来要稍微改一下东西。

    Janus默认的配置,是没有enable SSL的,意味着,https和wss不支持。而有些浏览器,要拉起摄像头,必须是加密的。所以,如果你Demo运行不起来,可以服务端配置一下SSL。
    具体说明如下。

    1.4.1 生成ssl的证书

    cd ~
    mkdir ssl
    cd ssl
    # Gen ssl certs:
    openssl req -new -newkey rsa:4096 -nodes -keyout key.pem -out cert.csr
    openssl x509 -req -sha256 -days 365 -in cert.csr -signkey key.pem -out cert.pem
    chmod 600 cert.csr
    chmod 600 cert.pem
    chmod 600 key.pem
    

    当然了,我们这个是私人证书,Demo没问题,如果是公司性质,则需要弄个正式的证书来。如果对SSL证书不太了解,可以看这个文章:https://www.runoob.com/w3cnote/http-vs-https.html

    1.4.2 配置文件修改ssl信息

    打开/opt/janus/etc/janus/janus.jcfg,certificates修改key路径

    certificates: {
            cert_pem = "/home/chenxiaofeng/ssl/cert.pem"
            cert_key = "/home/chenxiaofeng/ssl/key.pem"
            cert_pwd = "123456"
            #dtls_accept_selfsigned = false
            #dtls_ciphers = "your-desired-openssl-ciphers"
            #rsa_private_key = false
    }
    
    

    再打开/opt/janus/etc/janus/janus.transport.http.jcfg, 修改generals和certificates,启用https

    general: {
            #events = true                                  # Whether to notify event handlers about transport events (default=true)
            json = "indented"                               # Whether the JSON messages should be indented (default),
                                                                            # plain (no indentation) or compact (no indentation and no spaces)
            base_path = "/janus"                    # Base path to bind to in the web server (plain HTTP only)
            http = true                                             # Whether to enable the plain HTTP interface
            port = 8088                                             # Web server HTTP port
          
            https = true                                    # Whether to enable HTTPS (default=false)
            secure_port = 8089                              # Web server HTTPS port, if enabled
    
    }
    
    
    certificates: {
            cert_pem = "/home/chenxiaofeng/ssl/cert.pem"
            cert_key = "/home/chenxiaofeng/ssl/key.pem"
            cert_pwd = "123456"
            #ciphers = "PFS:-VERS-TLS1.0:-VERS-TLS1.1:-3DES-CBC:-ARCFOUR-128"
    }
    
    

    再打开/opt/janus/etc/janus/janus.transport.websockets.jcfg, 修改generals和certificates,启用wss。

    general: {
    
            ws = true                                               # Whether to enable the WebSockets API
            ws_port = 8188                                  # WebSockets server port
            #ws_interface = "eth0"                  # Whether we should bind this server to a specific interface only
            #ws_ip = "192.168.0.1"                  # Whether we should bind this server to a specific IP address only
            wss = true                                              # Whether to enable secure WebSockets
            wss_port = 8989                         # WebSockets server secure port, if enabled
    }
    
    certificates: {
            cert_pem = "/home/chenxiaofeng/ssl/cert.pem"
            cert_key = "/home/chenxiaofeng/ssl/key.pem"
            cert_pwd = "123456"
            #ciphers = "PFS:-VERS-TLS1.0:-VERS-TLS1.1:-3DES-CBC:-ARCFOUR-128"
    }
    

    1.4.3 运行起来

    执行命令:

    /opt/janus/bin/janus --debug-level=7
    

    启动后端口就会打印一些日志信息,请关注。

    Janus commit: 8491eb860bf7fdcee94b5fdec9e9e430fbe2421c
    Compiled on:  2020? 11? 26? ??? 18:19:39 CST
    
    Logger plugins folder: /opt/janus/lib/janus/loggers
    [WARN] 	Couldn't access logger plugins folder...
    ---------------------------------------------------
      Starting Meetecho Janus (WebRTC Server) v0.10.8
    ---------------------------------------------------
    
    [janus.jcfg]
       ....
    
    [WARN] Janus is deployed on a private address (192.168.1.107) but you didn't specify any STUN server! Expect trouble if this is supposed to work over the internet and not just in a LAN...
    Using certificates:
    	/home/chenxiaofeng/ssl/cert.pem
    	/home/chenxiaofeng/ssl/key.pem
    Crypto: OpenSSL pre-1.1.0
    [WARN] The libsrtp installation does not support AES-GCM profiles
    Fingerprint of our certificate: ED:9C:80:16:2B:E6:C6:4E:43:B3:A5:8A:60:C3:0D:9B:44:B7:35:23:42:6C:03:6F:05:20:EE:1D:85:40:17:76
    [WARN] Data Channels support not compiled
    [WARN] Event handlers support disabled
    Plugins folder: /opt/janus/lib/janus/plugins
    Sessions watchdog started
    Joining Janus requests handler thread
    Loading plugin 'libjanus_sip.so'...
    JANUS SIP plugin created!
    Configuration file: /opt/janus/etc/janus/janus.plugin.sip.jcfg
    [ERR] [config.c:janus_config_parse:191]   -- Error reading configuration file 'janus.plugin.sip.jcfg'... error 2 (No such file or directory)
    [WARN] Couldn't find .jcfg configuration file (janus.plugin.sip), trying .cfg
    Configuration file: /opt/janus/etc/janus/janus.plugin.sip.cfg
    [ERR] [config.c:janus_config_parse:191]   -- Error reading configuration file 'janus.plugin.sip.cfg'... error 2 (No such file or directory)
    Local IP set to 192.168.1.107
    JANUS SIP plugin initialized!
    	Version: 8 (0.0.8)
    	   [janus.plugin.sip] JANUS SIP plugin
    	   This is a simple SIP plugin for Janus, allowing WebRTC peers to register at a SIP server and call SIP user agents through a Janus instance.
    	   Plugin API version: 15
    Loading plugin 'libjanus_audiobridge.so'...
    Joining SIP handler thread
    JANUS AudioBridge plugin created!
    Configuration file: /opt/janus/etc/janus/janus.plugin.audiobridge.jcfg
    [ERR] [config.c:janus_config_parse:191]   -- Error reading configuration file 'janus.plugin.audiobridge.jcfg'... error 2 (No such file or directory)
    [WARN] Couldn't find .jcfg configuration file (janus.plugin.audiobridge), trying .cfg
    Configuration file: /opt/janus/etc/janus/janus.plugin.audiobridge.cfg
    [ERR] [config.c:janus_config_parse:191]   -- Error reading configuration file 'janus.plugin.audiobridge.cfg'... error 2 (No such file or directory)
    JANUS AudioBridge plugin initialized!
    	Version: 11 (0.0.11)
    	   [janus.plugin.audiobridge] JANUS AudioBridge plugin
    	   This is a plugin implementing an audio conference bridge for Janus, mixing Opus streams.
    	   Plugin API version: 15
    Loading plugin 'libjanus_videocall.so'...
    Joining AudioBridge handler thread
    JANUS VideoCall plugin created!
    Configuration file: /opt/janus/etc/janus/janus.plugin.videocall.jcfg
    [janus.plugin.videocall.jcfg]
        general: {
        }
    JANUS VideoCall plugin initialized!
    	Version: 6 (0.0.6)
    	   [janus.plugin.videocall] JANUS VideoCall plugin
    	   This is a simple video call plugin for Janus, allowing two WebRTC peers to call each other through a server.
    	   Plugin API version: 15
    Loading plugin 'libjanus_streaming.so'...
    Joining VideoCall handler thread
    JANUS Streaming plugin created!
    [WARN] libcurl not available, Streaming plugin will not have RTSP support
    Configuration file: /opt/janus/etc/janus/janus.plugin.streaming.jcfg
    [janus.plugin.streaming.jcfg]
       ....
    Adding Streaming mountpoint 'rtp-sample'
    Audio enabled, Video enabled, Data NOT enabled
    Audio enabled, Video enabled, Data NOT enabled
    Adding Streaming mountpoint 'file-live-sample'
    Starting streaming relay thread
    Adding Streaming mountpoint 'file-ondemand-sample'
      ::: [1][rtp-sample] Opus/VP8 live stream coming from external source (live, RTP source, public, pin: no pin)
      ::: [2][file-live-sample] a-law file source (radio broadcast) (live, file source, public, pin: no pin)
      ::: [3][file-ondemand-sample] mu-law file source (music) (on demand, file source, public, pin: no pin)
    Filesource (live) thread starting...
    [file-live-sample] Opening file source /opt/janus/share/janus/streams/radio.alaw...
    [file-live-sample] Streaming audio file: /opt/janus/share/janus/streams/radio.alaw
    JANUS Streaming plugin initialized!
    	Version: 8 (0.0.8)
    	   [janus.plugin.streaming] JANUS Streaming plugin
    	   This is a streaming plugin for Janus, allowing WebRTC peers to watch/listen to pre-recorded files or media generated by an external source.
    	   Plugin API version: 15
    Loading plugin 'libjanus_echotest.so'...
    Joining Streaming handler thread
    JANUS EchoTest plugin created!
    Configuration file: /opt/janus/etc/janus/janus.plugin.echotest.jcfg
    [janus.plugin.echotest.jcfg]
        general: {
        }
    JANUS EchoTest plugin initialized!
    	Version: 7 (0.0.7)
    	   [janus.plugin.echotest] JANUS EchoTest plugin
    	   This is a trivial EchoTest plugin for Janus, just used to showcase the plugin interface.
    	   Plugin API version: 15
    Loading plugin 'libjanus_nosip.so'...
    Joining EchoTest handler thread
    JANUS NoSIP plugin created!
    Configuration file: /opt/janus/etc/janus/janus.plugin.nosip.jcfg
    [ERR] [config.c:janus_config_parse:191]   -- Error reading configuration file 'janus.plugin.nosip.jcfg'... error 2 (No such file or directory)
    [WARN] Couldn't find .jcfg configuration file (janus.plugin.nosip), trying .cfg
    Configuration file: /opt/janus/etc/janus/janus.plugin.nosip.cfg
    [ERR] [config.c:janus_config_parse:191]   -- Error reading configuration file 'janus.plugin.nosip.cfg'... error 2 (No such file or directory)
    Local IP set to 192.168.1.107
    ....
    Adding VideoRoom room 'room-1234'
    Created VideoRoom: 1234 (Demo Room, public, opus/vp8 codecs, secret: adminpwd, pin: no pin, pvtid: optional)
    Adding VideoRoom room 'room-5678'
    Created VideoRoom: 5678 (VP9-SVC Demo Room, public, opus/vp9 codecs, secret: adminpwd, pin: no pin, pvtid: optional)
      ::: [5678][VP9-SVC Demo Room] 512000, max 6 publishers, FIR frequency of 10 seconds, opus audio codec(s), vp9 video codec(s)
      ::: [1234][Demo Room] 128000, max 6 publishers, FIR frequency of 10 seconds, opus audio codec(s), vp8 video codec(s)
    JANUS VideoRoom plugin initialized!
    	Version: 9 (0.0.9)
    	   [janus.plugin.videoroom] JANUS VideoRoom plugin
    	   This is a plugin implementing a videoconferencing SFU (Selective Forwarding Unit) for Janus, that is an audio/video router.
    	   Plugin API version: 15
    Loading plugin 'libjanus_textroom.so'...
    Joining VideoRoom handler thread
    Joining RTCP thread for RTP forwarders...
    JANUS TextRoom plugin created!
    [WARN] Data channels support not compiled, disabling TextRoom plugin
    [WARN] The 'janus.plugin.textroom' plugin could not be initialized
    Loading plugin 'libjanus_recordplay.so'...
    JANUS Record&Play plugin created!
    Configuration file: /opt/janus/etc/janus/janus.plugin.recordplay.jcfg
    [ERR] [config.c:janus_config_parse:191]   -- Error reading configuration file 'janus.plugin.recordplay.jcfg'... error 2 (No such file or directory)
    [WARN] Couldn't find .jcfg configuration file (janus.plugin.recordplay), trying .cfg
    Configuration file: /opt/janus/etc/janus/janus.plugin.recordplay.cfg
    [ERR] [config.c:janus_config_parse:191]   -- Error reading configuration file 'janus.plugin.recordplay.cfg'... error 2 (No such file or directory)
    [FATAL] [plugins/janus_recordplay.c:janus_recordplay_init:749] No recordings path specified, giving up...
    [WARN] The 'janus.plugin.recordplay' plugin could not be initialized
    Loading plugin 'libjanus_voicemail.so'...
    JANUS VoiceMail plugin created!
    Configuration file: /opt/janus/etc/janus/janus.plugin.voicemail.jcfg
    [ERR] [config.c:janus_config_parse:191]   -- Error reading configuration file 'janus.plugin.voicemail.jcfg'... error 2 (No such file or directory)
    [WARN] Couldn't find .jcfg configuration file (janus.plugin.voicemail), trying .cfg
    Configuration file: /opt/janus/etc/janus/janus.plugin.voicemail.cfg
    [ERR] [config.c:janus_config_parse:191]   -- Error reading configuration file 'janus.plugin.voicemail.cfg'... error 2 (No such file or directory)
    ....
    libwebsockets logging: 0
    WebSockets server started (port 8188)...
    Using certificates:
    	/home/chenxiaofeng/ssl/cert.pem
    	/home/chenxiaofeng/ssl/key.pem
    Secure WebSockets server started (port 8989)...
    [WARN] Admin WebSockets server disabled
    [WARN] Secure Admin WebSockets server disabled
    JANUS WebSockets transport plugin initialized!
    	Version: 1 (0.0.1)
    	   [janus.transport.websockets] JANUS WebSockets transport plugin
    	   This transport plugin adds WebSockets support to the Janus API via libwebsockets.
    	   Plugin API version: 8
    	   Janus API: enabled
    	   Admin API: disabled
    Loading transport plugin 'libjanus_pfunix.so'...
    WebSockets thread started
    JANUS Unix Sockets transport plugin created!
    Configuration file: /opt/janus/etc/janus/janus.transport.pfunix.jcfg
    [WARN] Unix Sockets server disabled (Janus API)
    [WARN] Unix Sockets server disabled (Admin API)
    [WARN] No Unix Sockets server started, giving up...
    [WARN] The 'janus.transport.pfunix' plugin could not be initialized
    
    

    启动日志有一些点需要关注:

    (a) STUN server警告

    [WARN] Janus is deployed on a private address (192.168.1.107) but you didn't specify any STUN server! Expect trouble if this is supposed to work over the internet and not just in a LAN...
    

    上面的警告,对于我们运行Demo是没问题的。因为Demo一般运行在局域网,没有P2P打通的需要。但如果你是正式使用。则需要解决这个WARNING。
    具体而言,就是安装STUN server,然后打开
    /opt/janus/etc/janus/janus.jcfg
    修改以下内容

    nat: {
            #stun_server = "stun.voip.eutelia.it"
            #stun_port = 3478
    ..
            #turn_server = "myturnserver.com"
            #turn_port = 3478
            #turn_type = "udp"
            #turn_user = "myuser"
            #turn_pwd = "mypassword"
    

    安装STUN server其实就是安装coturn。很简单

    git clone https://github.com/coturn/coturn
    cd coturn
    ./configure 
    make 
    sudo make install
    

    安装coturn服务器不一定和janus一起,也可以一起。总之,装好后把信息写到janus的配置文件中。
    有关coturn的介绍和安装,还可以见:https://medium.com/av-transcode/what-is-webrtc-and-how-to-setup-stun-turn-server-for-webrtc-communication-63314728b9d0

    (b)Janus 的视频会议插件运行成功

    JANUS VideoRoom plugin initialized!
    

    如果没上面那句话,可能代表插件安装有问题,需要解决。

    (c) Janus的websocket启动成功

    WebSockets thread started
    

    代表websocket启动成功。

    (d)Janus的http启动成功

    HTTP webserver started (port 8088, /janus path listener)...
    

    1.4.4 检查运行端口

    可以通过端口查看是否运行正常。

    lsof -i | grep janus
    janus   32306 chenxiaofeng    5u  IPv6  887081      0t0  UDP *:rfe 
    janus   32306 chenxiaofeng    6u  IPv6  887082      0t0  UDP *:5004 
    janus   32306 chenxiaofeng   13u  IPv6  884414      0t0  TCP *:omniorb (LISTEN)
    janus   32306 chenxiaofeng   16u  IPv6  884415      0t0  TCP *:8089 (LISTEN)
    janus   32306 chenxiaofeng   21u  IPv4  884417      0t0  TCP *:8188 (LISTEN)
    janus   32306 chenxiaofeng   24u  IPv4  884418      0t0  TCP *:8989 (LISTEN)
    

    8089是https, 8188是ws, 8989是wss(websocket secure)

    2. 运行网页端Demo

    网页端的demo,在janus下载的源码就有了。在源码根目录的html目录下。

    现在就是要把这个html发布出来,从而其外部的浏览器,能够访问。

    用什么发布呢,这里介绍http-server。

    sudo apt-get install nodejs
    sudo npm -g install http-server
    

    安装好以后,进入janus源码的html目录。然后执行http-server。

    > http-server 
    Starting up http-server, serving ./
    Available on:
      http://127.0.0.1:8080
      http://192.168.1.107:8080
    Hit CTRL-C to stop the server
    
    

    此时,就把demo发布出来了,根据提示,打开http://192.168.1.107:8080。是一个网页。

    有2个经典的测试可以看。一个是Echo Test,这个是把电脑的视频推出去,同时拉回来。
    在这里插入图片描述

    还有一个是Video Room,就是视频会议。
    在这里插入图片描述
    点击start
    在这里插入图片描述
    随便写一个名称,然后加入,默认就进了1234的房间。如果你再打开一个网页,再写个名字加入,就有2个人了。demo最多支持6个人。
    在这里插入图片描述

    注意,如果要用websocket的ws或者wss,需要修改html/echotest.js或者html/videoroomtest.js文件,把server字段改一下,例如:

    var server = "ws://" + window.location.hostname + ":8188";
    

    另外,高能预警 web的demo,默认都是走http的,这在有些环境下的浏览器,是无法拉起摄像头的(权限问题),如果Demo运行失败,可以尝试https!!!我这里就遇到了,http死活不行,https稳得一匹!

    当然了,我们用http-server发布,默认是不支持https的。如果要发布https,则启动http-server的命令,需要改一下,加上SSL的参数(想了解更多http-server如何配置SSL,见https://www.npmjs.com/package/http-server):

    > http-server --ssl --cert /home/chenxiaofeng/ssl/cert.pem --key /home/chenxiaofeng/ssl/key.pem
    Starting up http-server, serving ./ through https
    Available on:
      https://127.0.0.1:8080
      https://192.168.1.107:8080
    
    

    启动后,浏览器打开,会有警告,原因是我们ssl的key是自己随便生成的,没啥问题。点击最下面的链接即可。
    在这里插入图片描述

    打开以后,就可以玩Demo了!

    3. 运行Android端Demo

    除了网页端demo,android也可以做一样的事情。
    下载janus的android demo源码。
    https://github.com/meetecho/janus-mobile-sdk

    尴尬的是,android的demo怎么编译,介绍的比较少。好在我摸索出来了。
    首先,到源码目录,执行make。
    make其实就是下载一些关键的第三方库,比如boringssl,编译demo要用。具体可以看根目录的Makefile。
    make前,最好手动删除third_party整个目录,我这发现当前的最新代码(2020-12-07),默认有third_party/boringssl空目录,这会导致以为有了这个模块,不会下载。

    另外,make过程中,还会提示没有装go,无法继续下载。咋办,那就装一个。

    sudo apt-get install golang
    

    接下来。AndroidStudio打开,引入工程即可。
    目录是janus-mobile-sdk/examples/android

    理论上,可以编译成功。

    运行例子如下
    在这里插入图片描述
    输入框写地址,一个是IP,一个是端口。8088就是Janus的http端口。

    点击Echo Test,然后点击START, CALL,即可运行成功。
    在这里插入图片描述

    除了官方的Demo,也有人自己纯通过websocket+rtc实现了android客户端。
    这里我找到一个可运行的是:
    https://github.com/lesliebeijing/JanusAndroidDemo

    不过跑起来会崩溃,一方面是权限的代码要改一下,一方面是,websocket链接会失败。报错是:

    CLEARTEXT communication to 192.168.1.107 not permitted by network security policy
    
    

    原因,见:https://stackoverflow.com/questions/45940861/android-8-cleartext-http-traffic-not-permitted

    解决办法:
    AndroidManifest加一个
    在这里插入图片描述

    参考

    https://zhuanlan.zhihu.com/p/201113990
    https://medium.com/agileops/install-janus-webrtc-ubuntu-server-18-04-4-b7e855de772e
    https://www.qnrtc.com/posts/1195716763.html

    展开全文
  • Windows下RN环境搭建及官方Demo运行

    千次阅读 2017-08-01 19:15:38
    Windows下RN环境搭建及官方Demo运行

    Windows下RN环境搭建及官方Demo运行

    一.Android 工程环境构建

    • 1-1:AS安装(IDE)
    • 1-2:JDK安装

    二.React-Native环境构建

    2-1:Note.js安装(必选)(包含js解析引擎,用来解析js代码)

    Note.js 安装步骤参考:http://www.jianshu.com/p/03a76b2e7e00

    2-2(可选):curl工具安装:curl是利用URL语法在命令行方式下工作的开源文件传输工具。它支持很多协议:FTP, FTPS, HTTP, HTTPS, GOPHER, TELNET, DICT, FILE 以及 LDAP。 我们主要是用来拉取nodejs生成的所需的离线bundle;另一种方式是,使用原生react-native命令生成离线bundle

    • 1.windows系统:到该地址下载相关的zip包https://curl.haxx.se/download/
    • 2.解压到下载的zip包到指定的目录下,此处以E:\Program Files\curl-7.54.1为例
    • 3.此时在该目录下打开命令行窗口,执行curl -V(大写)查看版本信息,如果有版本信息则说明已经可以使用,ps:也可以直接请求一个网址看看其返回的网页信息 curl www.baidu.com
    • 4.如果想在其他目录下也能执行curl命令,配置系统环境变量:在系统环境变量path中添加
      该curl的目录路径,此处即为上面的解压目录E:\Program Files\curl-7.54.1

    2.3:react-native命令行工具安装(必选)

    需要说明一点的是,该处安装的react-native相当于node.js的一个插件,有了该react-native插件,才能1.初始化出一个带有支持RN组件的android Demo工程,2.该插件的作用还有当node.js服务启动后,当native端的APP发起JS的bundle请求时,检查服务端的js信息是否有更新,并打出native端所需的bundle传给native端

    2.3.1安装方法:
    • 一种是使用node.js自带的npm包管理工具执行:npm install -g react-native-cli 实现安装 ps:-cli前无空格
    • 另外一种是使用git clone react-native的安装包到本地目录,命令为:git clone https://github.com/facebook/react-native.git,然后进入刚刚目录下的react-native目录下的react-native-cli目录,输入npm install -g实现安装。
    2.3.2 此处我们使用第一种安装方法,过程如下(该react-native安装到的位置默认为:【C:\Users\用户名\AppData\Roaming\npm】,如果前面node.js安装后有配置相关信息可以在配置的目录下找到)


    ps:出现以下错误信息,则上面的命令-cli前面加了空格,去掉空格重新执行命令即可:

    Looks like you installed react-native globally, maybe you meant react-native-cli?
    To fix the issue, run:
    npm uninstall -g react-native
    npm install -g react-native-cli
    
    2.3.3 验证是否安装成功可以输入 react-native -v 查看版本号如果可以即为安装成功如下:

    2.4:git 安装(可选)

    三.使用react-native命令初始化RN工程

    3.1 进入要创建工程的目录(随意)命令行下执行 命令:react-native init MyFirstRNDemo (需要科学上网,等待完成时间较长)



    初始化完成后的目录结构如下:

    • 此过程主要是初始化Android工程,简单说就是按照Android的工程结构创建一个Android的工程,和Android原生工程不同的是,该工程里面已经引入了RN组件,此处的RN组件指的是Android工程下的组件需要区分其与上面Node.js下安装的React-native不是一个概念
    • 生成的目录中的android目录即为我们熟悉的Android下的工程目录,同样的IOS的对应于io目录
    • 生成的目录中的index.android.js即为node.js需要解析的js文件,其对应js端的逻辑和布局,因为Demo工程较为简单,只对应有这一个js文件,里面内容是app中要显示的内容
    • 生成目录中的package.json,该文件是node.js工程初始化之后的一个配置文件,由此可以看到,该目录目前是node.js工程和android工程的混合
    • 生成目录中的node-modules该目录下是React开发对应此处React-native开发所需要的js端官方封装好的基础组件,我们能够直接使用一些Android中对应的js端组件就在于此处提供,相当于Anddoid工程下的系统API
    3.2执行命令:react-native start(也可不执行,不执行时在执行下一个安装命令的时候,底层会在检测到node.js服务未启动的时候自动启动起来)

    • 该命令会启动node.js服务,该服务的根目录在上一步init的时候设置的也为文件的根目录,此时启动后,根目录即为服务端的根目录,该根目录下的index.android.js文件即可以被node.js解析到并按规则,转化为bundle文件供Native端解析使用。
      ps:当使用离线包时,则只需把生成的bundle文件拿出放到natice端指定的目录下,能够被native端的react native模块识别加载到即可。离线情况下,native端集成所需的bundle,如果没有更新JS段的代码,则不需要新的bundle,即也不需要再与该服务端交互。
    3.3 验证js服务端是否启动们可以在浏览器中输入http://localhost:8081/index.android.bundle?platform=android 查看是否能够连接
    3.4 连接android手机到电脑进入工程的根目录,执行命令:react-native run-android,编译上一步init出来的android工程代码并安装到手机
    编译安装init出来的Android工程命令:react-native run-android
    

    PS:1.此过程如果出现JDK路径错误,请修改JAVA_HOME值到bin目录上一级,path里面改为%JAVA_HOME%/bin,ps:win10遇到过改过之后,需要重启后才起效的情况

    2.如果出现ANDROID_HOME无效找不到,需要配置Android的SDK位置,方法是在环境变量中添加键为ANDROID_HOME,值为Android SDK 位置的目录,默认地址一般为C:\Users\XXXX(用户名)\AppData\Local\Android\sdk,或者直接在生成工程的android目录下,新建local.property文件添加SDK的路径进去格式为

    local.property//文件名
    sdk.dir=E:\Users\Administrator\AppData\Local\Android\sdk //需要添加的键值对

    3.5 安装成功则demo app 会直接启动,由于此时使用usb连接,demo app(客户端)能够与电脑的node.js服务端交互加载到js文件,因此正常能够看到RN的页面如下:

    3.6 此时RN的APP已经安装完毕,但有以下需要注意:
    3.6.1 此时app和node.js服务端的交互是通过数据线传递的数据,如果拔掉数据线,摇晃手机打开RN开发者菜单,点击reload,可能会出现红屏,提示:could not connect to development server.

    3.6.2 解决方法为:首先保证手机和电脑处于同一wifi下,然后摇出RN开发者工具菜单依次打开Dev Setting–>Debugging–>然后输入电脑在该网段分配的IP地址,并设置端口号为8081(node.js服务的默认端口号)格式如下:192.168.3.3:8081,然后重新reload此时即可重新请求到数据

    四.至此,React-native官方的demo工程已经安装完毕

    当前的页面即是通过解析js端的布局及逻辑,并依靠RN Native端的模块重构出来的android原生页面。你可以打开根目录下的index.android.js 做一些简单的布局或者文案的修改然后重新reload,即可看到效果,而这也正是RN的亮点

    五.总结:

    • 首先明确一点:执行init命令出来的目录是一个node.js工程,同时其下面的android文件夹也是一个android工程
    • 1.RN native端的工程的构建首先是在android原生的工程之上的,因此JDK和androidi开发的SDK不能少
    • 2.为什么要用node.js:由于RN工程UI和逻辑是使用JS来完成的实现的,并且native端要能够请求到这些文件。要解析这些,并能实现作为一个服务端,供客户端请求官方推荐的是Node.js,这是为什么使用node.js的原因
    • 3.为什么要在node.js上安装react-native的插件:同时js端的实现是和native端对应的,而js端的实现想要能够被native端识别并展现出来是需要符合相关规则的,而这些规则的解析及生成相关native端需要的bundle,node.js是不足够的,因此我们需要facebook为此实现的react-native 插件,node.js通过该插件即可解析并进一步生成bundle文件,以供使用

    • 4.react的组件开发要按照相关规则,我们知道在native段android有大量的系统组件已经实现,因此相应在js端facebook官方也已经按规则实现了相当一部分的控件及实现,这些组件在我们执行 react-native -init的时候即会直接帮我们拉取到根目录下即目录node_modules,而不是有我们自己重新一个一个的对应解析关系并封装使用而是直接引用即可,facebook同时也将这种规则暴漏了出来,这也使开发者同样有能力自己定义自定义的组件并使用,但需要知道一点是js端可以用的基础组件是由native端按照规则暴漏出来的。

      ps:关于是怎么拉取到node_modules的可以打开根目录下的package.json,该文件为node.js工程初始化后的配置文件,有点类似于android的gradle文件里面配置了当前node.js工程,package.json配置如下

      {
          "name": "MyFirstRNDemo",//node.js工程的名称
          "version": "0.0.1",//版本
          "private": true,
          "scripts": {
              "start": "node node_modules/react-native/local-cli/cli.js start",//这个是我们使用ract-native -start 能够启动node.js服务的原因,其根本上还是调用了node的命令
              "test": "jest"
          },
          "dependencies": {//这个是该工程依赖的组件 分别为react和react-native,和android一样编译的时候会拉取相关对应的组件,对应会放到node_modulese文件夹下,这样对于node.js工程来说,入口文件index.android.js中也就能够直接引用相关组件了,如果js端代码可以参考facebook的写法,还是不错的
              "react": "16.0.0-alpha.12",//node.js工程依赖的react
              "react-native": "0.46.4"//node.js工程依赖的react-native版本
          },
          "devDependencies": {
              "babel-jest": "20.0.3",
              "babel-preset-react-native": "2.1.0",
              "jest": "20.0.4",
              "react-test-renderer": "16.0.0-alpha.12"
          },
          "jest": {
              "preset": "react-native"
          }
      }
      
    • 5.关于命令 react-native init <工程名> 该步会从相关的远程copy配置好的工程目录层次到本地,并同时初始化当前目录为node.js工程,如果直接用node命令初始化当前目录为node.js工程,该命令为:node init,会拉取所有的当前根目录package.json中配置的所有依赖

    • 6.关于命令 react-native start 该命令是用来启动node.js服务 对应的nide命令为node -start
    • 7.关于命令 react-native run-android 该命令则执行编译android工程并生成APK包,进一步安装到手机上,这个和我们使用AndroidStudio构建工程是一样的
    • 8.APP启动native模块会到当前服务端拉取相关的bundle信息,此时服务端的地址,即为在react-native start时启动的node.js地址,在局域网中可以使用IP:端口号指定,node.js服务默认开的端口是8081,这也是为什么我们需要在调试时手机和电脑在同一个网段下,并需要设置IP和端口的原因
    • 9.APP在拿到服务端生成的bundle信息之后,会重构为native端的控件/组件显示出来
    • 10.以上尽量列举了按照官方步骤跑起来一个RN demo的过程,同时也大致列举出了构建出来工程各模块的关系以及各工具所扮演的角色。这样当我们改造原生Android工程时会比较好理清那些事我们必须要做的,以及那样做的意义,但以上没有涉及native端相对于原生的android工程有哪些差别,这在我们自己动手改造一个原生android工程之后,自然就会清楚

    以上为RN工程环境搭建及运行,后面会改造一个现有的Android工程以了解RN工程native端和原生的有何差别,以及JS端的是怎么运作的

    展开全文
  • caffe中web_demo运行调试(三)运行实例 1.前言 上上一篇博文点这里已经把运行caffe的Web_Demo需要环境准备了。如果有任何报错请参考上一篇博文。 接下开始运行caffe的web_demo实例。 2.实践 在终端中进入...

    caffe中web_demo的运行调试(三)运行实例

    1.前言

    上上一篇博文点这里已经把运行caffe的Web_Demo需要环境准备了。如果有任何报错请参考上一篇博文。

    接下开始运行caffe的web_demo实例。

    2.实践

    在终端中进入caffe的根目录下。

    1.web_demo 的运行需要Python支持和一些依赖,确保已经安装依赖。
    运行:

    sudo pip install -r examples/web_demo/requirements.txt
    • 1

    来检查依赖环境是否安装完成?没有的它会给帮你安装。
    如下界面就是已经准备了依赖环境:
    这里写图片描述

    2.确定自己的caffe已经编译了Python Caffe并且包含在PYTHONPATH 中。
             就是说你已经配置了caffe的python接口,并且关联到了python路径,这个基本上在搭建caffe环境的时候就完成了的。在这里不做介绍。
    验证方法:

    >python
    >import caffe
    >
    • 1
    • 2
    • 3

    不报错即可。

    3.下载 Reference CaffeNet Model 和 the ImageNet Auxiliary Data:
    caffe根目录下运行:

    ./scripts/download_model_binary.py models/bvlc_reference_caffenet
    ./data/ilsvrc12/get_ilsvrc_aux.sh
    • 1
    • 2

    注意: 如果运行报错,请尝试重新下载Auxiliary files.

    3.运行

    做完上面的操作以后,继续在caffe根目录下执行

    python examples/web_demo/app.py
    • 1

    启动服务器

    将会启动demo服务器,端口号为5000,
    然后打开浏览器输入:https://0.0.0.0:5000
    就可以开启web server的debug模式。
    显示的index.html如下:
    首页

    其次,当你运行:

    python examples/web_demo/app.py -h
    • 1

    的时候,可以打开帮助菜单。
    帮组菜单

    4.测试识别

    测试:
    百度图片搜索一张狗的图片,然后复制图片地址:
    野狗
    图片测试图片

    然后在caffe_demo的网页上填入url。进行识别
    结果:
    识别结果

    不仅是识别了是狗,还能详细识别到是一个豺/野狗(wild dog)。

    上面就是整个caffe下的web_demo的记录。

    注意,配置web_demo的依赖环境的时候我有很多问题,如果你也出现了问题,请参考上一篇博文。

    You got a dream, you gotta protect it.
    如果你有梦想的话,就要去捍卫它 。 ——《当幸福来敲门》

    展开全文
  • Unity 3D网页游戏 Demo 展示

    万次阅读 热门讨论 2011-02-15 23:16:00
    Unity Demo
  • 支付宝集成过程详解——运行DEMO

    万次阅读 多人点赞 2015-11-11 11:02:54
    具体细节就不再详聊了,下面就讲讲如何将阿里给出的demo运行起来。 二、阿里支付DEMO 1、概述 (1)支付调用页面及测试 支付宝在调用时,会首先看本地是不是存在支付宝客户端,如果有的话,就直接调用...
  • 网页爬虫简单demo

    2016-06-27 15:51:51
    今天用htmlcleaner写了一个最简单的网页爬虫,记录一下。 首先新建一个java工程 导入htmlcleaner的jar包 新建一个类,从指定网页中获取指定内容 大致原理为首先获取指定地址的所有元素,然后按照给定的...
  • 简易网页聊天室DEMO

    千次阅读 2015-03-16 10:42:02
    主要实现了群聊功能 原理很简单: 本地(javascript)向服务器发送消息(图片或者文字),由服务器...暂时还未区分用户姓名、ip、时间等信息(不过这都是很简单的) ... DEMO //定义一些变量 var chat_board;
  • 最近使用ROS的时候,有个大佬给我推荐了ClearPath公司的Husky机器人的GPS路径跟踪包,具体内容我还没开始看,现在只是光想运行一下demo。 ... (访问网页需要梯子) 安装demo 首先我们按照官网的教程安装好demo,我...
  • 2.第二个问题是我在运行Demo里面的wifi Demo关于easylink时,具体是下面这一步: 我发现在自己的终端里面,始终是这样的: 就根本没有start easylink combo mode,后来提了问,终于解决了,问题...
  • 运行自动化测试demo

    2018-06-12 12:56:24
    今天我们学习一下怎么运行自动化测试demo,读者先跟着我的步骤,一步一步来,先不讲为什么要这样做,后面的文章我会讲到你的这些疑问。 步骤一 在maven项目Test里创建一个文件夹,文件夹命名为resourses,用于...
  • flowable-6.6.0 运行官方 demo

    千次阅读 2020-11-23 11:32:18
    flowable-6.6.0 运行官方 demo 1. 从官网下载flowable-6.5.0 : https://flowable.com/open-source/downloads/ 下载完,解压后,打开目录 wars 2.找个干净的 tomcat8 把 wars 文件目录里面的 flowable-admin....
  • 打开比特币Demo演示网页区块链Demo演示地址,我们可以看到如下页面。 点击开始演示 接下来是BlockChain Demo 2.0的新功能介绍 关于Demo功能区的介绍 并附有JavaScript代码和gitHubDemo地址 显示每个...
  • IE下使用VLC网页播放视频Demo

    千次阅读 2018-08-30 13:59:58
    今天主要是给大家一个简单使用的demo,只能在IE浏览器下运行,火狐和chrome的低版本是支持VLC的,高版本是不支持VLC的了。 写这个的原因是因为公司业务需要和第三方公司对接,然后对方居然不知道VLC如何使...
  • 支付宝当面付demo 使用idea打开并按照如下步骤 将其修改为idea可运行的web项目 打开file project structure 将本demo模块导入 点击下图中的选项,在进行一次导入 这时项目就会出现web目录,将下图中所指向的...
  • 支付宝集成历程详解——运行DEMO

    千次阅读 2016-06-24 13:18:03
    一、申请移动支付权限 ...申请开通支付,是需要公司文件...具体细节就不再详聊了,下面就讲讲如何将阿里给出的demo运行起来。 二、阿里支付DEMO 1、概述 (1)支付调用页面及测试 支付宝在调用时,会首先
  • 一、首先准备下本地环境(本地就需要一个微信开发工具) ... ...这里能查看到AppID(小程序ID) AppSecret(小程序...这样的你的小程序demo可能就能顺利的运行了,,如果还有问题,直接在右上角给疼讯云提工单,相应很快
  • Qt编写activex控件在网页运行

    千次阅读 2018-07-22 23:18:42
    qt能够实现的东西非常多,还可以写activex控件直接在网页运行。参照qtdemo下的例子即可。 可执行文件下载:https://pan.baidu.com/s/14ge9ix2Ny0x7kr7K5JS8zA  第一步:解压到英文路径的目录。 第二步:打开...
  • 生成网页缩略图的DEMO

    千次阅读 2011-09-07 15:52:04
    在linux服务器上通过命令行 cmd -url 的形式 抓取制定url地址的网页缩略图,保存到本地。 实现方式: Xvfb + qtwebkit qtwebkit 代码示例: main.cpp #include #include "webmock.h" int main(int ...
  • Spring WebSocket简单入门测试Demo(网页及时聊天)
  • 网页H5获取当前坐标,完整demo

    千次阅读 2017-08-23 08:32:05
    手机运行效果很好,也很准,电脑嘛,有时超时,有时偏出80多公里。 css部分: #allmap { overflow: hidden;margin:0;z-index: 10; } .savept{position: fixed;left:40%;z-index: 11;} .mapbox{display: none;} ...
  • python web py入门-2-显示一个demo网页

    万次阅读 2017-09-04 23:15:15
    本篇来一个动手显示一个网页,这个网页不只是打印hello world。这个网页包含一些html和css和javascript知识。所以,在学习web.py之前,我们还是需要有一些html语法和javascript的语法知识,如果一点也不会,请看我...
  • 支付宝电脑网站支付demo导入idea运行

    千次阅读 2020-05-08 14:36:06
    保存设置后会生成支付宝公钥,保留支付宝公钥会在项目中使用到 下载demo运行 下载地址 将demo导入到idea中运行 生成web.xml文件 如下图所示操作 点击选择我们的项目 将/WebContent/WEB-INF/lib目录下的jar包添加到...
  • Ukey,网页,web demo访问U盘用户验证

    千次阅读 2016-05-27 22:57:08
    Ukey用户使用说明     ... ...安装后需要重启电脑或手工重启此服务.... 本Ukey上附有发布运行所需文件,应做好...建议直接在本地备份目录下运行,运行文件存于Release目录下,该目录下的UKey_Service_Install是可执行的
  • 使用页面插件实现网页及时通信Demo

    千次阅读 2010-04-14 21:07:00
    该工程利用Flex插件实现网页及时通信功能,包括消息群发、组管理等功能。测试要求:Web项目启动之后,需手动启用com.gis.lp.commander.CChatRoom程序实现思路:服务器端(主要是以CChatRoom为代表的各实现类)实现...
  • 第一期——搭建运行环境并运行DEMO Notice:本文章可在“Angelic47——个人站点”、“KBEngine论坛”与“KBEngine 官方QQ群”发表,版权由Angelic47和引擎作者所有,其他人转载时请注明来源,否则视为侵权行为! ...
  • VS Code插件开发教程--树视图+网页视图完整demo+图--1简介一、安装二、初识 VS code 插件 demo三、treeView: 重识 package.json 简介 你好! 本人为 2019.7 毕业的应届毕业生,目前从事前端工程师的职业。对知识充满...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 53,178
精华内容 21,271
关键字:

网页的demo怎么运行