springcloud alibaba整合nacos服务注册中心和ribbon服务调用
springcloud alibaba整合nacos服务注册中心和ribbon服务调用nacos安装nacos的作用spring cloud整合nacos添加maven依赖启动类修改添加配置整合ribbon创建负载均衡的restTemplate测试结果nacos安装从官网上(https://nacos.io/zh-cn/index.html)下载最新版本的nacos的tar.gz包,上传到自己虚拟
springcloud alibaba整合nacos服务注册中心和ribbon服务调用
nacos安装
从官网上(https://nacos.io/zh-cn/index.html)下载最新版本的nacos的tar.gz包,上传到自己虚拟机或是云主机上指定目录下,解压启动即可,因为是作为学习之用,所以这是部署单节点的nacos服务
启动命令:切换到bin目录下执行sh ./startup.sh -m standalone即可,密码账号密码默认是nacos/nacos
nacos的作用
nacos主要有两大功能,服务注册中心和配置中心,当然个人喜欢nacos用作服务注册中心,至于配置中心个人习惯用携程开源的apollo,如果需要,请参考本人另一篇博客https://blog.csdn.net/weixin_41521925/article/details/107429549
spring cloud整合nacos
添加maven依赖
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring-cloud-alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
启动类修改
启动类上只需要添加@EnableDiscoveryClient注解即可
添加配置
在application.properties配置文件中添加如下配置
spring.application.name=cust-service
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
#springboot中文乱码
#spring.http.encoding.force=true
#spring.http.encoding.charset=UTF-8
#spring.http.encoding.enabled=true
server.tomcat.uri-encoding=UTF-8
# spring cloud access&secret config
# 可以访问如下地址查看: https://usercenter.console.aliyun.com/#/manage/ak
alibaba.cloud.access-key=****
alibaba.cloud.secret-key=****
server.port=8081
server.servlet.context-path=/cust-service
spring.cloud.nacos.discovery.server-addr=192.168.142.11:8848
### 服务分组名称
spring.cloud.nacos.discovery.group=${spring.application.name}
### 服务实例集群
spring.cloud.nacos.discovery.cluster-name=B-cluster
可以在服务nacos中查看到分组下不同集群中的实例服务,服务分组可以区别用项目组名称等,集群可以用来做灰度环境等,比如A集群是某些账号访问的,B项目是生产所有账号访问的,方便吧,具体怎么做之后会提供下思路,自由发挥
这我启动了5个服务实例,都是在一个组下面
组下面分了AB两个集群
看到这会有种熟悉的感觉吧,nacos使用了著名的领域模型,具体可百度学习下什么是领域模型
整合ribbon
微服务是将之前的单体架构按服务边界拆分的微小服务,服务间的交互一般通过http进行调用,上面我们启动了cust-service服务,接下来我们创建一个order-service服务并添加相关依赖,maven依赖和cust-service差不多,当然,我们先把cust-service配置中的组合集群配置注释掉,否则使用resttemplate调用服务会报错,至于保什么错个人可以实践下就行,解决方案很多,下面我会提供一种思路,但没实现。
创建负载均衡的restTemplate
package com.zc.study.order.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.StringHttpMessageConverter;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import java.nio.charset.Charset;
import java.util.List;
@Configuration
@Component
public class BeanConfig {
private static String charset = "UTF-8";
/**
* 初始化restTemplate实例并设置接口调用为utf-8编码
* @return
*/
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
RestTemplate restTemplate = new RestTemplate();
List<HttpMessageConverter<?>> list = restTemplate.getMessageConverters();
for (HttpMessageConverter<?> httpMessageConverter : list) {
if(httpMessageConverter instanceof StringHttpMessageConverter) {
((StringHttpMessageConverter) httpMessageConverter).setDefaultCharset(Charset.forName(charset));
break;
}
}
return restTemplate;
}
}
两个服务中分别提供测试的接口,我这是order-service调用cust-service
order-service上的接口如下
/**
*订单客户
* @return
*/
@PostMapping("/orderCust")
public String custInfo(){
String url = "http://cust-service/cust-service/test/custInfo";
Map<String,Object> resMap = restTemplate.getForObject(url, Map.class);
resMap.put("memo","订单中心调用客户中心获取订单客户信息");
return JSON.toJSONString(resMap);
}
接下来启动cust-service和order-service服务
测试结果
http://localhost:7071/order-service/test/orderCust
{
“age”: 26,
“certNum”: “911253366945563985”,
“custName”: “张三”,
“memo”: “订单中心调用客户中心获取订单客户信息”
}
默认是使用轮训的负载均衡策略
接下来我们说下之前说的为什么需要注释掉组合集群的配置,至于具体实现可以自行思考
/**
* 当注册中心中不适用默认group和集群后,restTemplate调用会失败
* 这个需要使用discoveryClient来调用,这种方式不做介绍,原理也很简单,
* 通过discoveryClient获取到服务实例,instances,获取到url后使用httpClient或者是restTemplate调用即可
* 注意:如果使用restTemplate,restTemplate的实例对象上不能添加注解@LoadBalanced
* 因为使用了@LoadBalanced,会默认将url的ip端口解析成服务名,之后在nacos服务注册中心找不到服务,
* 就会保服务找不到的错
* {"host":"192.168.43.242","metadata":{"nacos.instanceId":"192.168.43.242#8083#DEFAULT#DEFAULT_GROUP@@cust-service","nacos.weight":"1.0","nacos.cluster":"DEFAULT","nacos.healthy":"true","preserved.register.source":"SPRING_CLOUD"},"port":8083,"secure":false,"serviceId":"cust-service","uri":"http://192.168.43.242:8083"}
*/
代码已上传到码云,如有需要可参考学习https://gitee.com/prick/micro-service.git
更多推荐
所有评论(0)