微服务注册中心Nacos以及负载均衡实战


一、前言

提示:本文讲到的代码部分来自上文
上文链接地址

二、微服务注册中心Nacos

1、介绍

服务注册:服务提供者provider,启动的时候向注册中心上报自己的网络信息
服务发现:服务消费者consumer,启动的时候向注册中心上报自己的网络信息,拉取provider的相关网络信息
核心:服务管理,是有个服务注册表,心跳机制动态维护,服务实例在启动时注册到服务注册表,并在关闭时注销。

2、下载地址

官网地址

3、Linux/Mac安装Nacos

解压安装包
进入bin目录
启动 sh startup.sh -m standalone
关闭 sh shutdown.sh
访问 localhost:8848/nacos
默认账号密码 nacos/nacos

三、项目集成Nacos实现服务直接的调用

1、添加依赖

        <!--添加nacos客户端-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>

2、配置Nacos地址

server:
  port: 8000

spring:
  application:
    name: spring-other1 #服务的名称
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

3、启动类增加注解

@EnableDiscoveryClient //注入到注册中心

在这里插入图片描述

4、服务之间的调用(可通过随机数实现负载均衡)

@RestController
@RequestMapping("other2")
public class OtherController2 {

    //通过restTemplate远程调用
    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private DiscoveryClient discoveryClient;
    /**
     * 使用Nacos
     * @param userName
     * @return
     */
    @RequestMapping("getusername2")
    String getUserName2(@RequestParam("name") String userName) {
        //获取服务列表,因为是集群所以是list
        List<ServiceInstance> instanceList = discoveryClient.getInstances("spring-other1");
        ServiceInstance serviceInstance = instanceList.get(0);
        String userName2 = restTemplate.getForObject("http://"+serviceInstance.getHost()+":"+serviceInstance.getPort()+"/other1/getusername?name="+userName,String.class);
        return userName2 + "-该字段为other2的getUserName反回的数据";
    }
}

在这里插入图片描述

5、测试集群

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

四、通过Ribbon实现负载均衡策略

1、在启动类RestTemplate上添加注解@LoadBalanced

1、首先从注册中心获取provider的列表
2、通过一定的策略选择其中一个节点
3、再返回给restTemplate调用

@SpringBootApplication
@EnableDiscoveryClient
public class SpringOther2Application {
    public static void main(String[] args) {
        SpringApplication.run(SpringOther2Application.class,args);
    }
    @Bean
    @LoadBalanced//开启负载均衡Ribbon
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
}

2、被调用方controller代码

@RestController
@RequestMapping("other1")
public class OtherController1 {

	//方便知道是那台机器
    @RequestMapping("getusername2")
    String getUserName2(@RequestParam("name") String userName, HttpServletRequest request) {
        return userName+"-由"+request.getServerName()+":"+request.getServerPort()+"发起";
    }
}

3、调用方controller代码

@RestController
@RequestMapping("other2")
public class OtherController2 {

    //通过restTemplate远程调用
    @Autowired
    private RestTemplate restTemplate;

    /**
     * 使用Ribbon负载均衡
     * @param userName
     * @return
     */
    @RequestMapping("getusername3")
    String getUserName3(@RequestParam("name") String userName) {
        //写入服务名即可
        String userName2 = restTemplate.getForObject("http://spring-other1/other1/getusername2?name="+userName,String.class);
        return userName2 + "-该字段为other2的getUserName反回的数据";
    }
}

效果图
在这里插入图片描述
在这里插入图片描述

五、负载均衡策略调整

策略类命名描述
RandomRule随机策略随机选择server
RoundRobinRule轮询策略按照顺序选择server(默认)
RetryRule重试策略当选择server不成功,短期内尝试选择一个可用的server
AvailabilityFilteringRule可用过滤策略过滤掉一直失败并被标记为circuit tripped的server,过滤掉那些高并发链接的server(active connections超过配置的阈值)
WeightedResponseTimeRule响应时间加权重策略根据server的响应时间分配权重,以响应时间作为权重,响应时间越短的服务器被选中的概率越大,综合了各种因素,比如:网络,磁盘,io等,都直接影响响应时间
ZoneAvoidanceRule区域权重策略综合判断server所在区域的性能,和server的可用性,轮询选择server

1、启动配置文件中修改策略

在调用方的启动配置文件

spring-other1: #服务名称
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #负载均衡策略(该为随机)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

和烨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值