windows下配置apache tomcat 负载均衡

1 相关软件下载 apache JK tomcat 

2 安装和配置
apache的安装 具体过程略过。点击next就可以。直接访问http://localhost 能看到apache主页面就算成功安装完成

修改http.conf 文件
先打开注释的行

LoadModule proxy_module modules/mod_proxy.so 

LoadModule proxy_ajp_module modules/mod_proxy_ajp.so 

LoadModule proxy_balancer_module modules/mod_proxy_balancer.so

LoadModule proxy_connect_module modules/mod_proxy_connect.so 

LoadModule proxy_ftp_module modules/mod_proxy_ftp.so 

LoadModule proxy_http_module modules/mod_proxy_http.so 

Include conf/extra/httpd-vhosts.conf 

在配置文件中加入

include conf/mod_jk.conf
ProxyRequests Off

<proxy balancer://loadbalancer> 

BalancerMember ajp://192.168.1.200:8109 loadfactor=1 route=tomcat1 

BalancerMember ajp://192.168.1.200:8209 loadfactor=1 route=tomcat2 

</proxy>

再在conf 目录中加入mod_jk.conf这个配置文件
在文件中加入如下内容:

#加载mod_jk Module

LoadModule jk_module modules/mod_jk.so

#指定 workers.properties文件路径

JkWorkersFile conf/workers.properties 

#指定那些请求交给tomcat处理,”controller”为在workers.propertise里指定的负载分配控制器

JkMount /*.jsp controller

JkMount /*.do controller 

JkMount /* controller

再在conf 中新建workers.properties这个配置文件
在文件中加入如下内容:

#server 列表

worker.list = controller,tomcat1,tomcat2 

#========tomcat1======== 

worker.tomcat1.port=8109 

worker.tomcat1.host=192.168.1.200 

worker.tomcat1.type=ajp13 

worker.tomcat1.lbfactor = 1

#========tomcat2======== 

worker.tomcat2.port=8209

worker.tomcat2.host=192.168.1.200 

worker.tomcat2.type=ajp13 

worker.tomcat2.lbfactor = 2

#========controller,负载均衡控制器========

worker.controller.type=lb

worker.controller.balanced_workers=tomcat1,tomcat2 

worker.controller.sticky_session=1

再配置httpd-vhosts.conf这个文件(此文件在conf\extra\目录下面)

在文件的最下面添加好下:

<VirtualHost *:80>
ServerAdmin xxxx@xxx.com
ServerName 192.168.1.200
ServerAlias 192.168.1.200
ProxyPass / balancer://loadbalancer/ stickysession=jsessionid nofailover=On
ProxyPassReverse / balancer://loadbalancer/
ErrorLog “logs/loadbalancer-error.log”
CustomLog “logs/loadbalancer-access.log” common
</VirtualHost>

Apache 在此就配置完成,接下来配置tomcat
这里是分了二个tomcat (tomcat1,tomcat2)

我直接贴出tomcat1配置文件

<?xml version=’1.0′ encoding=’utf-8′?>
<!–
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements. See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the “License”); you may not use this file except in compliance with
  the License. You may obtain a copy of the License at
      http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an “AS IS” BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
–>
<!– Note: A “Server” is not itself a “Container”, so you may not
     define subcomponents such as “Valves” at this level.
     Documentation at /docs/config/server.html
 –>
<Server port=”8105″ shutdown=”SHUTDOWN”>
  <!–APR library loader. Documentation at /docs/apr.html –>
  <Listener className=”org.apache.catalina.core.AprLifecycleListener” SSLEngine=”on” />
  <!–Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html –>
  <Listener className=”org.apache.catalina.core.JasperListener” />
  <!– Prevent memory leaks due to use of particular java/javax APIs–>
  <Listener className=”org.apache.catalina.core.JreMemoryLeakPreventionListener” />
  <!– JMX Support for the Tomcat server. Documentation at /docs/non-existent.html –>
  <Listener className=”org.apache.catalina.mbeans.ServerLifecycleListener” />
  <Listener className=”org.apache.catalina.mbeans.GlobalResourcesLifecycleListener” />
  <!– Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  –>
  <GlobalNamingResources>
    <!– Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    –>
    <Resource name=”UserDatabase” auth=”Container”
              type=”org.apache.catalina.UserDatabase”
              description=”User database that can be updated and saved”
              factory=”org.apache.catalina.users.MemoryUserDatabaseFactory”
              pathname=”conf/tomcat-users.xml” />
  </GlobalNamingResources>
  <!– A “Service” is a collection of one or more “Connectors” that share
       a single “Container” Note: A “Service” is not itself a “Container”, 
       so you may not define subcomponents such as “Valves” at this level.
       Documentation at /docs/config/service.html
   –>
  <Service name=”Catalina”>
  
    <!–The connectors can use a shared executor, you can define one or more named thread pools–>
    <!–
    <Executor name=”tomcatThreadPool” namePrefix=”catalina-exec-” 
        maxThreads=”150″ minSpareThreads=”4″/>
    –>
    
    
    <!– A “Connector” represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    –>
    <Connector port=”8180″ protocol=”HTTP/1.1″ 
               connectionTimeout=”20000″ 
               redirectPort=”8443″ />
    <!– A “Connector” using the shared thread pool–>
    <!–
    <Connector executor=”tomcatThreadPool”
               port=”8080″ protocol=”HTTP/1.1″ 
               connectionTimeout=”20000″ 
               redirectPort=”8443″ />
    –> 
    <!– Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the JSSE configuration, when using APR, the 
         connector should be using the OpenSSL style configuration
         described in the APR documentation –>
    <!–
    <Connector port=”8443″ protocol=”HTTP/1.1″ SSLEnabled=”true”
               maxThreads=”150″ scheme=”https” secure=”true”
               clientAuth=”false” sslProtocol=”TLS” />
    –>
    <!– Define an AJP 1.3 Connector on port 8009 –>
    <Connector port=”8109″ protocol=”AJP/1.3″ redirectPort=”8443″ />

    <!– An Engine represents the entry point (within Catalina) that processes
         every request. The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html –>
    <!– You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”jvm1″> 
    –> 
    <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”tomcat1″>
      <!–For clustering, please take a look at documentation at:
          /docs/cluster-howto.html (simple how to)
          /docs/config/cluster.html (reference documentation) –>
      
      
   <Cluster className=”org.apache.catalina.ha.tcp.SimpleTcpCluster” channelSendOptions=”6″>
          <Manager className=”org.apache.catalina.ha.session.BackupManager”
                   expireSessionsOnShutdown=”false”
                   notifyListenersOnReplication=”true”
                   mapSendOptions=”6″/>
          <!–
          <Manager className=”org.apache.catalina.ha.session.DeltaManager”
                   expireSessionsOnShutdown=”false”
                   notifyListenersOnReplication=”true”/>
          –> 
          <Channel className=”org.apache.catalina.tribes.group.GroupChannel”>
            <Membership className=”org.apache.catalina.tribes.membership.McastService”
                        address=”228.0.0.4″
                        port=”45564″
                        frequency=”500″
                        dropTime=”3000″/>
            <Receiver className=”org.apache.catalina.tribes.transport.nio.NioReceiver”
                      address=”auto”
                      port=”50001″
                      selectorTimeout=”100″
                      maxThreads=”6″/>
            <Sender className=”org.apache.catalina.tribes.transport.ReplicationTransmitter”>
              <Transport className=”org.apache.catalina.tribes.transport.nio.PooledParallelSender”/>
            </Sender>
            <Interceptor className=”org.apache.catalina.tribes.group.interceptors.TcpFailureDetector”/>
            <Interceptor className=”org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor”/>
            <Interceptor className=”org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor”/>
          </Channel>
          <Valve className=”org.apache.catalina.ha.tcp.ReplicationValve”
                 filter=”.*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;”/>
          <Deployer className=”org.apache.catalina.ha.deploy.FarmWarDeployer”
                    tempDir=”/tmp/war-temp/”
                    deployDir=”/tmp/war-deploy/”
                    watchDir=”/tmp/war-listen/”
                    watchEnabled=”false”/>
          <ClusterListener className=”org.apache.catalina.ha.session.ClusterSessionListener”/>
        </Cluster> 
     
      <!– This Realm uses the UserDatabase configured in the global JNDI
           resources under the key “UserDatabase”. Any edits
           that are performed against this UserDatabase are immediately
           available for use by the Realm. –>
      <Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
             resourceName=”UserDatabase”/>
      <!– Define the default virtual host
           Note: XML Schema validation will not work with Xerces 2.2.
       –>
      <Host name=”localhost” appBase=”webapps”
            unpackWARs=”true” autoDeploy=”true”
            xmlValidation=”false” xmlNamespaceAware=”false”>
        <!– SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html –>
        <!–
        <Valve className=”org.apache.catalina.authenticator.SingleSignOn” />
        –>
        <!– Access log processes all example.
             Documentation at: /docs/config/valve.html –>
        <!–
        <Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs” 
               prefix=”localhost_access_log.” suffix=”.txt” pattern=”common” resolveHosts=”false”/>
        –>
      </Host>
    </Engine>
  </Service>
</Server>

tomcat2 的配置文件我也贴出来如下:

<?xml version=’1.0′ encoding=’utf-8′?>
<!–
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements. See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the “License”); you may not use this file except in compliance with
  the License. You may obtain a copy of the License at
      http://www.apache.org/licenses/LICENSE-2.0
  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an “AS IS” BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
–>
<!– Note: A “Server” is not itself a “Container”, so you may not
     define subcomponents such as “Valves” at this level.
     Documentation at /docs/config/server.html
 –>
<Server port=”8205″ shutdown=”SHUTDOWN”>
  <!–APR library loader. Documentation at /docs/apr.html –>
  <Listener className=”org.apache.catalina.core.AprLifecycleListener” SSLEngine=”on” />
  <!–Initialize Jasper prior to webapps are loaded. Documentation at /docs/jasper-howto.html –>
  <Listener className=”org.apache.catalina.core.JasperListener” />
  <!– Prevent memory leaks due to use of particular java/javax APIs–>
  <Listener className=”org.apache.catalina.core.JreMemoryLeakPreventionListener” />
  <!– JMX Support for the Tomcat server. Documentation at /docs/non-existent.html –>
  <Listener className=”org.apache.catalina.mbeans.ServerLifecycleListener” />
  <Listener className=”org.apache.catalina.mbeans.GlobalResourcesLifecycleListener” />
  <!– Global JNDI resources
       Documentation at /docs/jndi-resources-howto.html
  –>
  <GlobalNamingResources>
    <!– Editable user database that can also be used by
         UserDatabaseRealm to authenticate users
    –>
    <Resource name=”UserDatabase” auth=”Container”
              type=”org.apache.catalina.UserDatabase”
              description=”User database that can be updated and saved”
              factory=”org.apache.catalina.users.MemoryUserDatabaseFactory”
              pathname=”conf/tomcat-users.xml” />
  </GlobalNamingResources>
  <!– A “Service” is a collection of one or more “Connectors” that share
       a single “Container” Note: A “Service” is not itself a “Container”, 
       so you may not define subcomponents such as “Valves” at this level.
       Documentation at /docs/config/service.html
   –>
  <Service name=”Catalina”>
  
    <!–The connectors can use a shared executor, you can define one or more named thread pools–>
    <!–
    <Executor name=”tomcatThreadPool” namePrefix=”catalina-exec-” 
        maxThreads=”150″ minSpareThreads=”4″/>
    –>
    
    
    <!– A “Connector” represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    –>
    <Connector port=”8280″ protocol=”HTTP/1.1″ 
               connectionTimeout=”20000″ 
               redirectPort=”8443″ />
    <!– A “Connector” using the shared thread pool–>
    <!–
    <Connector executor=”tomcatThreadPool”
               port=”8080″ protocol=”HTTP/1.1″ 
               connectionTimeout=”20000″ 
               redirectPort=”8443″ />
    –> 
    <!– Define a SSL HTTP/1.1 Connector on port 8443
         This connector uses the JSSE configuration, when using APR, the 
         connector should be using the OpenSSL style configuration
         described in the APR documentation –>
    <!–
    <Connector port=”8443″ protocol=”HTTP/1.1″ SSLEnabled=”true”
               maxThreads=”150″ scheme=”https” secure=”true”
               clientAuth=”false” sslProtocol=”TLS” />
    –>
    <!– Define an AJP 1.3 Connector on port 8009 –>
    <Connector port=”8209″ protocol=”AJP/1.3″ redirectPort=”8443″ />

    <!– An Engine represents the entry point (within Catalina) that processes
         every request. The Engine implementation for Tomcat stand alone
         analyzes the HTTP headers included with the request, and passes them
         on to the appropriate Host (virtual host).
         Documentation at /docs/config/engine.html –>
    <!– You should set jvmRoute to support load-balancing via AJP ie :
    <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”jvm1″> 
    –> 
    <Engine name=”Catalina” defaultHost=”localhost” jvmRoute=”tomcat2″>
      <!–For clustering, please take a look at documentation at:
          /docs/cluster-howto.html (simple how to)
          /docs/config/cluster.html (reference documentation) –>
     <Cluster className=”org.apache.catalina.ha.tcp.SimpleTcpCluster” channelSendOptions=”6″>
          <Manager className=”org.apache.catalina.ha.session.BackupManager”
                   expireSessionsOnShutdown=”false”
                   notifyListenersOnReplication=”true”
                   mapSendOptions=”6″/>
          <!–
          <Manager className=”org.apache.catalina.ha.session.DeltaManager”
                   expireSessionsOnShutdown=”false”
                   notifyListenersOnReplication=”true”/>
          –> 
    
          <Channel className=”org.apache.catalina.tribes.group.GroupChannel”>
            <Membership className=”org.apache.catalina.tribes.membership.McastService”
                        address=”228.0.0.4″
                        port=”45564″
                        frequency=”500″
                        dropTime=”3000″/>
            <Receiver className=”org.apache.catalina.tribes.transport.nio.NioReceiver”
                      address=”auto”
                      port=”50002″
                      selectorTimeout=”100″
                      maxThreads=”6″/>
            <Sender className=”org.apache.catalina.tribes.transport.ReplicationTransmitter”>
              <Transport className=”org.apache.catalina.tribes.transport.nio.PooledParallelSender”/>
            </Sender>
            <Interceptor className=”org.apache.catalina.tribes.group.interceptors.TcpFailureDetector”/>
            <Interceptor className=”org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor”/>
            <Interceptor className=”org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor”/>
          </Channel>
          <Valve className=”org.apache.catalina.ha.tcp.ReplicationValve”
                 filter=”.*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;”/>
          <Deployer className=”org.apache.catalina.ha.deploy.FarmWarDeployer”
                    tempDir=”/tmp/war-temp/”
                    deployDir=”/tmp/war-deploy/”
                    watchDir=”/tmp/war-listen/”
                    watchEnabled=”false”/>
          <ClusterListener className=”org.apache.catalina.ha.session.ClusterSessionListener”/>
        </Cluster>
      <!– The request dumper valve dumps useful debugging information about
           the request and response data received and sent by Tomcat.
           Documentation at: /docs/config/valve.html –>
      <!–
      <Valve className=”org.apache.catalina.valves.RequestDumperValve”/>
      –>
      <!– This Realm uses the UserDatabase configured in the global JNDI
           resources under the key “UserDatabase”. Any edits
           that are performed against this UserDatabase are immediately
           available for use by the Realm. –>
      <Realm className=”org.apache.catalina.realm.UserDatabaseRealm”
             resourceName=”UserDatabase”/>
      <!– Define the default virtual host
           Note: XML Schema validation will not work with Xerces 2.2.
       –>
      <Host name=”localhost” appBase=”webapps”
            unpackWARs=”true” autoDeploy=”true”
            xmlValidation=”false” xmlNamespaceAware=”false”>
        <!– SingleSignOn valve, share authentication between web applications
             Documentation at: /docs/config/valve.html –>
        <!–
        <Valve className=”org.apache.catalina.authenticator.SingleSignOn” />
        –>
        <!– Access log processes all example.
             Documentation at: /docs/config/valve.html –>
        <!–
        <Valve className=”org.apache.catalina.valves.AccessLogValve” directory=”logs” 
               prefix=”localhost_access_log.” suffix=”.txt” pattern=”common” resolveHosts=”false”/>
        –>
      </Host>
    </Engine>
  </Service>
</Server>

二个配置文件
1 端口号需要修改如下的 

<Server port=”8205″ shutdown=”SHUTDOWN”>

<Connector port=”8280″ protocol=”HTTP/1.1″
connectionTimeout=”20000″
redirectPort=”8443″ /> 

<Connector port=”8209″ protocol=”AJP/1.3″ redirectPort=”8443″ />

<Receiver className=”org.apache.catalina.tribes.transport.nio.NioReceiver”
address=”auto”
port=”50002″
selectorTimeout=”100″
maxThreads=”6″/>

主要是修改  port=”50002″这个端口号要唯一.
在server.xml 文件中要加入如下代码:

 <Cluster className="org.apache.catalina.ha.tcp.SimpleTcpCluster"                 channelSendOptions="6">          <Manager className="org.apache.catalina.ha.session.BackupManager"                   expireSessionsOnShutdown="false"                   notifyListenersOnReplication="true"                   mapSendOptions="6"/>          <!--          <Manager className="org.apache.catalina.ha.session.DeltaManager"                   expireSessionsOnShutdown="false"                   notifyListenersOnReplication="true"/>          -->                  <Channel className="org.apache.catalina.tribes.group.GroupChannel">            <Membership className="org.apache.catalina.tribes.membership.McastService"                        address="228.0.0.4"                        port="45564"                        frequency="500"                        dropTime="3000"/>            <Receiver className="org.apache.catalina.tribes.transport.nio.NioReceiver"                      address="auto"                      port="5000"                      selectorTimeout="100"                      maxThreads="6"/>            <Sender className="org.apache.catalina.tribes.transport.ReplicationTransmitter">              <Transport className="org.apache.catalina.tribes.transport.nio.PooledParallelSender"/>            </Sender>            <Interceptor className="org.apache.catalina.tribes.group.interceptors.TcpFailureDetector"/>            <Interceptor className="org.apache.catalina.tribes.group.interceptors.MessageDispatch15Interceptor"/>            <Interceptor className="org.apache.catalina.tribes.group.interceptors.ThroughputInterceptor"/>          </Channel>          <Valve className="org.apache.catalina.ha.tcp.ReplicationValve"                 filter=".*\.gif;.*\.js;.*\.jpg;.*\.png;.*\.htm;.*\.html;.*\.css;.*\.txt;"/>          <Deployer className="org.apache.catalina.ha.deploy.FarmWarDeployer"                    tempDir="/tmp/war-temp/"                    deployDir="/tmp/war-deploy/"                    watchDir="/tmp/war-listen/"                    watchEnabled="false"/>          <ClusterListener className="org.apache.catalina.ha.session.ClusterSessionListener"/>        </Cluster>

这样整个配置都完成了可以启动服务了, 先启动apache 再启动tomcat

概念: AJP是Apache提供的完成与其它服务器通讯的一种协议。在Apache中通过mod_proxy_ajp模块发送AJP数据,另外一端的服务器需要实现AJP协议,能够接受mod_proxy_ajp模块发送的AJP协议数据,在接受到AJP协议数据后适当处理,并能够将处理结果以AJP协议方式发送回给mod_proxy_ajp模块。 配置过程: 1 安装apache 2 测试apache是否安装成功:http://localhost 出现It works! 3 解压、安装tocmat 4 测试tocmat是否安装成功:http://localhost:8080 5 配置tocmat的jdk: 打开startup.bat添加: rem ----------------------------------------------------JDK目录 SET JAVA_HOME=D:\progam\jdk160_05 rem ----------------------------------------------------解压后Tomcat的目录 6 复制tocmat,名字为tomcat2 7 apache 整合tomcat 1)modules目录下添加模块:jk mod_jk-1.2.26-httpd-2.2.4.so 2)修改conf/httpd.conf 最后一行添加: include conf/mod_jk.conf 3)在conf目录下创建mok_jk.conf 内容: #加载mod_jk Module LoadModule jk_module modules/mod_jk-1.2.26-httpd-2.2.4.so #指定 workers.properties文件路径 JkWorkersFile conf/workers.properties #指定哪些请求交给tomcat处理,"controller"为在workers.propertise里指定的负载分配控制器名 JkMount /*.jsp controller 4)在confi目录下创建workers.properties 内容为: worker.list = controller,tomcat1,tomcat2 #========tomcat1======== worker.tomcat1.port=8009 worker.tomcat1.host=192.168.9.210 worker.tomcat1.type=ajp13 worker.tomcat1.lbfactor = 1 #加权因子 越大执行的请求越多 #========tomcat2======== worker.tomcat2.port=9009 worker.tomcat2.host=192.168.9.210 worker.tomcat2.type=ajp13 worker.tomcat2.lbfactor = 1 #========controller,负载均衡控制器======== worker.controller.type=lb worker.controller.balanced_workers=tomcat1,tomcat2 worker.controller.sticky_session=1 5 修改tomcat的端口号(3处) <Server port="8005" shutdown="SHUTDOWN"> 改为: <Server port="9005" shutdown="SHUTDOWN"> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> 改为: <Connector port="9090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"/> <Connector port="8009" protocol="AJP/1.3" redirectPort="8443"/> 改为: <Connector port="9009" protocol="AJP/1.3" redirectPort="8443"/> 注意:该处需要与worker.tomcat2.port=9009对应 6 修改jvmRoute 备注与worker.list = controller,tomcat1,tomcat2的tomcat1或tocmat2对应 <Engine name="Catalina" defaultHost="localhost" jvmRoute="tomcat1">
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值