
# 使用Cloud Map SDK（Spring Cloud框架）
#### 引入Cloud Map SDK
1. 引入STS Cloud Map依赖STS认证能力，接入Cloud Map必须接入STS，具体请参考[引入STS SDK](https://support.huaweicloud.com/sdkreference-appstage/appstage_08_0030.html#appstage_08_0030__section59541647173719)。
   
2. 引入Cloud Map 在pom.xml中添加Cloud Map SDK依赖。
   - 将${cloudmap-sdk-version}替换成实际所使用的Cloud Map SDK版本。
   
   - 如果将SDK放到外部maven仓中，则只需要添加nuwa-cloudmap-core依赖。
   
   - 如果采用本地依赖的方式引入SDK，即手动将本地下载的SDK jar包引入到工程的lib目录下，还需要添加间接依赖：nuwa-cloudmap-spring-boot-starter、spring-cloud-starter-cloudmap-discovery。
     ```
     <dependency>
        <groupId>com.huawei.wisecloud.nuwa</groupId>
        <artifactId>nuwa-cloudmap-core</artifactId>
        <version>${cloudmap-sdk-version}</version>
     </dependency>
     ```
     
    
 
#### 配置Cloud Map
在微服务的application.yaml配置文件中添加以下配置项：
```
nuwa:
  cloudmap:
    read: cloudmap                              #使用Cloud Map方式进行微服务间通信
    clusterName: clusterName-example            #微服务注册到Cloud Map的集群 
    provider:
      cluster: clusterName-example              #提供服务的其他同样被注册到Cloud Map的微服务集群名 
    serverAddr: http://10.34.32.243:80          #Cloud Map访问地址
    version: 1.0.0.100                          #微服务版本号
    namespaceName: cn_dev_default               #Cloud Map访问命名空间
```
#### 初始化Cloud Map
在启动类中增加@EnableDiscoveryClient注解，同时在启动类中完成将RestTemplate放到spring容器中，后续微服务间调用就使用注册到spring容器中的RestTemplate，代码如下：
```
package com.huawei.demo.servicea;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
import com.huawei.wisesecurity.sts.springboot.security.annotation.EnableStsAutoInitialization;
@SpringBootApplication
@EnableStsAutoInitialization(value = "application.properties")
@EnableDiscoveryClient
public class ServiceASpringbootApplication {
    public static void main(String[] args) {
        SpringApplication.run(ServiceASpringbootApplication.class, args);
    }
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}
```
微服务间调用：
```
public OrderInfo findOrder(String orderId, HttpServletRequest request) {
        OrderInfo orderInfo = orderMapper.getOrderById(orderId);
        String url = demoServiceAUrl + "/user/" + orderInfo.getUserId();
        HttpHeaders headers = createHeaders(request);
        HttpEntity<String> entity = new HttpEntity<>(null, headers);
        ResponseEntity<UserInfo> responseEntity = restTemplate.exchange(url, HttpMethod.GET, entity, UserInfo.class); ;
        if (responseEntity != null) {
            orderInfo.setUserInfo(responseEntity.getBody());
        }
        return orderInfo;
    }
```
