使用Cloud Map SDK(Spring Cloud框架)
引入Cloud Map SDK
- 引入STS
Cloud Map依赖STS认证能力,接入Cloud Map必须接入STS,具体请参考引入STS SDK。
- 引入Cloud Map
- 将${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。
配置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; }