在这里插入图片描述

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

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐