# 使用客户端连接RabbitMQ（开启SSL）
本章节以分布式消息服务RabbitMQ版提供的demo为例，介绍RabbitMQ客户端如何连接开启SSL的RabbitMQ实例，并生产和消费消息。开启SSL访问，则数据加密传输，安全性更高。
 #### 前提条件
- 已[购买RabbitMQ实例](https://support.huaweicloud.com/usermanual-rabbitmq/rabbitmq-ug-180604004.html)，并记录创建时输入的用户名和密码，实例开启SSL。
- 在实例详情中查看并记录"内网连接地址/公网连接地址"。
- 客户端所在服务器和RabbitMQ实例之间网络已互通，具体网络要求参见[连接RabbitMQ网络要求](https://support.huaweicloud.com/usermanual-rabbitmq/rabbitmq-ug-180604003.html)。
- 客户端所在服务器已安装[Java Development Kit 1.8.111或以上版本](https://www.oracle.com/java/technologies/downloads/#java8)，并配置JAVA_HOME与PATH环境变量，环境变量配置方法如下：
  使用执行用户在home目录下修改".bash_profile"，添加如下行。其中"/opt/java/jdk1.8.0_151"为JDK的安装路径，请根据实际情况修改。
  ```
  export JAVA_HOME=/opt/java/jdk1.8.0_151
  export PATH=$JAVA_HOME/bin:$PATH
  ```
  执行**source .bash_profile**命令使修改生效。
  
- RabbitMQ实例中已[创建Vhost](https://support.huaweicloud.com/usermanual-rabbitmq/rabbitmq_ug_0022.html)、[Exchange](https://support.huaweicloud.com/usermanual-rabbitmq/rabbitmq_ug_0027.html)和[Queue](https://support.huaweicloud.com/usermanual-rabbitmq/rabbitmq_ug_0029.html)，且[配置Exchange和Queue的绑定](https://support.huaweicloud.com/usermanual-rabbitmq/rabbitmq_ug_0031.html)。
 
#### 命令行模式连接实例
以下操作命令以Linux系统为例进行说明：
1. 登录客户端所在服务器。
2. 下载[RabbitMQ-Tutorial-SSL.zip](https://dms-demo.obs.cn-north-1.myhuaweicloud.com/RabbitMQ-Tutorial-SSL.zip)示例工程代码。
   
   ```
   wget https://dms-demo.obs.cn-north-1.myhuaweicloud.com/RabbitMQ-Tutorial-SSL.zip
   ```
   
   
3. 解压RabbitMQ-Tutorial-SSL.zip压缩包。 
   ```
   unzip RabbitMQ-Tutorial-SSL.zip
   ```
   
   
4. 进入RabbitMQ-Tutorial-SSL目录，该目录下包含预编译好的jar文件。 
   ```
   cd RabbitMQ-Tutorial-SSL
   ```
   
   
5. 运行生产消息示例。 
   ```
   java -cp .:rabbitmq-tutorial-sll.jar Send {host} {port} {user} {password}
   ```
   表1生产消息参数说明 
   | 参数名称     | 说明                                                                                                 |
   |:---|:---|
   | host     | RabbitMQ实例的连接地址，从[前提条件]中获取。   |
   | port   | RabbitMQ实例的连接端口，输入5671。                                                                          |
   | user   | 连接RabbitMQ实例的用户名，从[前提条件]中获取。 |
   | password | 连接RabbitMQ实例的密码，从[前提条件]中获取。  |
      
   图1生产消息示例   
   ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0286452833.png "点击放大")
   
   
6. 运行消费消息示例。 
   ```
   java -cp .:rabbitmq-tutorial-sll.jar Recv {host} {port} {user} {password}
   ```
   表2消费消息参数说明 
   | 参数名称     | 说明                                                                                                |
   |:---|:---|
   | host      | RabbitMQ实例的连接地址，从[前提条件]中获取。 |
   | port      | RabbitMQ实例的连接端口，输入5671。                                                                            |
   | user      | 连接RabbitMQ实例的用户名，从[前提条件]中获取。 |
   | password | 连接RabbitMQ实例的密码，从[前提条件]中获取。  |
      
   图2消费消息示例   
   ![](https://support.huaweicloud.com/usermanual-rabbitmq/zh-cn_image_0286452793.png "点击放大")
   如需停止消费使用**Ctrl+C**命令退出。
   
   
 
#### 示例代码（Java）
- 连接实例并生产消息示例代码如下，需要修改的参数如[表3]所示。
  ```
  ConnectionFactory factory = new ConnectionFactory();
   factory.setHost(host);
   factory.setPort(port);
   factory.setVirtualHost("VHOST_NAME");
   factory.setUsername(user);
   factory.setPassword(password);
   factory.useSslProtocol();
   Connection connection = factory.newConnection();
   Channel channel = connection.createChannel();
   channel.queueDeclare(QUEUE_NAME, false, false, false, null);
   String message = "Hello World!";
   channel.basicPublish("", QUEUE_NAME, null, message.getBytes("UTF-8"));
   System.out.println(" [x] Sent '" + message + "'");
   channel.close();
   connection.close();
  ```
   表3参数说明 
  | 参数名称        | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
  |:---|:---|
  | VHOST_NAME | 消息要发送的Queue所在的Vhost名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                           |
  | QUEUE_NAME   | 消息要发送的Queue名称。 - 3.x.x版本的Queue名称需要符合以下规则：只能由英文字母、数字、点、百分号、竖线、中划线、下划线、斜杠组成，长度为2\~128个字符，且名称不能为".."。  - AMQP-0-9-1版本的Queue名称需要符合以下规则：只能由英文字母、数字、点、百分号、竖线、中划线、下划线、斜杠组成，长度2\~64字符（每个特殊字符按3个字符计算长度），且名称不能为".."。   |
  | Hello World! | 待发送的消息，根据实际需要修改。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
     
  
- 连接实例并消费消息示例代码如下，需要修改的参数如[表4]所示。
  ```
  ConnectionFactory factory = new ConnectionFactory();
   factory.setHost(host);
   factory.setPort(port);
   factory.setVirtualHost("VHOST_NAME");
   factory.setUsername(user);
   factory.setPassword(password);
   factory.useSslProtocol();
   Connection connection = factory.newConnection();
   Channel channel = connection.createChannel();
   channel.queueDeclare(QUEUE_NAME, false, false, false, null);
   System.out.println(" [*] Waiting for messages. To exit press CTRL+C");
   Consumer consumer = new DefaultConsumer(channel)
   {
       @Override
       public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties,
               byte[] body)
               throws IOException
       {
           String message = new String(body, "UTF-8");
           System.out.println(" [x] Received '" + message + "'");
       }
   };
   channel.basicConsume(QUEUE_NAME, true, consumer);
  ```
   表4参数说明 
  | 参数名称        | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                         |
  |:---|:---|
  | VHOST_NAME  | 要消费消息的Queue所在的Vhost名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
  | QUEUE_NAME | 要消费消息的Queue名称。 - 3.x.x版本的Queue名称需要符合以下规则：只能由英文字母、数字、点、百分号、竖线、中划线、下划线、斜杠组成，长度为2\~128个字符，且名称不能为".."。  - AMQP-0-9-1版本的Queue名称需要符合以下规则：只能由英文字母、数字、点、百分号、竖线、中划线、下划线、斜杠组成，长度2\~64字符（每个特殊字符按3个字符计算长度），且名称不能为".."。   |
     
  
 
#### 相关文档
- [RabbitMQ客户端连接报错原因分析](https://support.huaweicloud.com/rabbitmq_faq/rabbitmq-faq-200518015.html)
- [为什么RabbitMQ集群只有一个连接地址？](https://support.huaweicloud.com/rabbitmq_faq/rabbitmq-faq-200701002.html)
 
