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

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
Spring Cloud Nacos是一个非常流行的微服务注册中心和配置中心,而Ribbon则是一个负载均衡组件。结合起来,可以实现服务的自动发现和负载均衡。 下面是一个简单的示例: 1. 在pom.xml文件中添加依赖: ```xml <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency> ``` 2. 在application.properties或application.yml中配置NacosRibbon: ```yaml # Nacos配置 spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848 # Ribbon配置 service-provider.ribbon.listOfServers=localhost:8081,localhost:8082 service-provider.ribbon.NIWSServerListClassName=com.netflix.loadbalancer.ConfigurationBasedServerList ``` 3. 创建一个Ribbon的配置类,用于自定义负载均衡策略等: ```java @Configuration public class RibbonConfig { @Bean public IRule ribbonRule() { return new RandomRule(); // 随机负载均衡策略 } @Bean public IPing ribbonPing() { return new PingUrl(false, "/health"); // 检查服务健康状态的URL } } ``` 4. 在服务消费方的代码中,注入RestTemplate对象,并使用@LoadBalanced注解: ```java @RestController public class ConsumerController { @Autowired private RestTemplate restTemplate; @GetMapping("/hello") public String hello() { String url = "http://service-provider/hello"; return restTemplate.getForObject(url, String.class); } @Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); } } ``` 在这里,我们使用了"http://service-provider/hello"作为服务提供方的URL,而不是具体的IP和端口。这是因为Ribbon会根据服务名自动选择一个可用的实例。 以上就是使用Spring Cloud NacosRibbon调用服务的基本步骤。需要注意的是,在使用Nacos作为注册中心时,服务提供方需要在启动时注册自己。可以参考Nacos的官方文档或者Spring Cloud官方文档进行配置和使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值