【alibaba-cloud】nacos详解

Nacos 支持基于 DNS 和基于 RPC 的服务发现(可以作为springcloud的注册中心)、动态配置服务(可以做配置中心)、动态 DNS 服务。

nacos的安装(windows和liunx的单机和集群)

https://blog.csdn.net/wangyunzhao007/article/details/106872831

nacos的配置中心

配置中心,顾名思义,就是我们可以把我们的配置都放置在nacos。

启动nacos后,我们输入地址http://127.0.0.1:8848/nacos/,账号和密码都是nacos。

点击配置列表,然后点击右边的加号,我们会看到下图,我们可以吧我们的配置文件写到下图,还可以选择不同的样式。

以yaml为例子,我写了一个简单的配置,data ID的名字不是随便命名的,pro代表profiles.profiles

这样就弄好一个配置了,接下怎么使用呢。

1.引入的pom依赖

        <!--  springboot 整合web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--nacos整合注册中心-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>
        <!--nacos整合config-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>

2.测试接口:这个用到我们刚刚配置好的mayikt.name

package com.mayikt.service;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RefreshScope
@SpringBootApplication
public class NacosController {
    @Value("${mayikt.name}")
    private String userName;

    @RequestMapping("/getConfig")
    public String getConfig() {
        return userName;
    }

}

3.添加启动项

@SpringBootApplication
@RefreshScope  //加上这个注解才能动态的刷新nacos配置文件的值
public class AppNacosClient {
    public static void main(String[] args) {
        SpringApplication.run(AppNacosClient.class);
    }
}

4.写bootstrap.yml

spring:
  application:
    ###服务的名称
    name: mayikt-nacos-client
  cloud:
    nacos:
      discovery:
        ###nacos注册地址
        server-addr: 127.0.0.1:8848
        enabled: true
      config:
        ###配置中心连接地址
        server-addr: 127.0.0.1:8848
        ###分组
        group: DEFAULT_GROUP
        ###类型
        file-extension: yaml
  profiles:
    C: pro

然后调用测试接口:得到了配置文件的信息。

nacos的服务注册和发现

新建一个父工程,下面有两个子工程,

父工程的pom依赖,子工程不需要

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.0.RELEASE</version>
    </parent>

    <dependencies>
        <!--  springboot 整合web组件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            <version>0.2.2.RELEASE</version>
        </dependency>
    </dependencies>

服务的注册方 member

接口:

@RestController
public class MemberService {
    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/getUser")
    public String getUser(Integer userId){

        return "hello world!端口号为" + serverPort;
    }
}

启动项

@SpringBootApplication
public class MemberApplication {
    public static void main(String[] args) {
        SpringApplication.run(MemberApplication.class);
    }
}

application.yml

spring:
  application:
    ###服务名称
    name: meitemk-member
  cloud:
    nacos:
      discovery:
        ###注册地址
        server-addr: 127.0.0.1:8848
server:
  port: 8081

服务的发现或使用方

接口:不同的获取服务的方法和负载均衡实现
 

package com.mayimk.service;

import com.mayimk.loadbalance.LoadBalancer;
import com.sun.jndi.toolkit.url.Uri;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.annotation.Primary;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.net.URI;
import java.util.List;
@RestController
public class OrderService1 {
    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private LoadBalancer loadBalancer;

    @Autowired
    private LoadBalancerClient loadBalancerClient;
    @RequestMapping("/orderToMeber1")
    public Object orderToMeber(){
        //1.根据服务名称从注册中心获取集群列表地址
        List<ServiceInstance> instances = discoveryClient.getInstances("meitemk-member");
        //2.列表中任意选取一个,实现本地的rpc调用  采用负载均衡算法实现
        ServiceInstance serviceInstance = loadBalancer.getSingleAddres(instances);
        URI recMemberUrl = serviceInstance.getUri();
        String result = restTemplate.getForObject(recMemberUrl +"/getUser", String.class);
        System.out.println(serviceInstance.getPort());
        return "订单调用返回结果:"+ result;
    }

    //使用rabbion实现负载均衡
    @RequestMapping("/orderToRibbonMeber")
    public Object orderToRibbonMeber(){
        String result = restTemplate.getForObject("http://meitemk-member/getUser", String.class);
        return "订单调用返回结果:"+ result;
    }

    /**
     *
     * @return
     */
    //cloud根据服务id实现负载均衡
    @RequestMapping("/loadBalanceClientvMember")
    public Object LoadBalanceClientvMember(){
        ServiceInstance result = loadBalancerClient.choose("meitemk-member");
        return result;
    }
}

本地负载均衡策略需要的代码:

package com.mayimk.loadbalance;

import org.springframework.cloud.client.ServiceInstance;

import java.util.List;

public interface LoadBalancer {

    /**
     * 从注册中心集群列表中获取单个地址
     * @param serviceInstances
     * @return
     */
    ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances);
}
package com.mayimk.loadbalance;

import org.springframework.cloud.client.ServiceInstance;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;

@Component
public class RotationLoadBalancer implements LoadBalancer {
    private AtomicInteger atomicInteger = new AtomicInteger(0);

    @Override
    public ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances) {
        //从零开始计数
        int index = atomicInteger.incrementAndGet() % serviceInstances.size();
        ServiceInstance serviceInstance = serviceInstances.get(index);
        return serviceInstance;
    }
}

启动项

@SpringBootApplication
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class);
    }

    /**
     * 加上@LoadBalanced,注解就可以实现我们本地的负载均衡
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

application.yml 

spring:
  application:
    ###服务名称
    name: meitemk-order
  cloud:
    nacos:
      discovery:
        ###注册地址
        server-addr: 127.0.0.1:8848
server:
  port: 8082

 然后我们启动两个子项目,然后修改member的端口号,将member再次启动,就会有两个不同端口号member。

我们可以看到nacos的服务列表中油member的服务实例有两个,然后order也注册到这里,也拉取了服务。我们可以调用order中的接口,接口调用了member中getUser接口,同时使用了负载均衡。

 

测试其中使用了rabbin方式的负载均衡,测试结果如下:

 、

代码资源下载地址:

https://download.csdn.net/download/wangyunzhao007/12540939

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值