Springcloud Alibaba集成nacos搭建服务集群并实现负载均衡


一、nacos下载、安装、启动

1.下载地址:https://github.com/alibaba/nacos/releases/tag/2.0.3

 2.解压后启动服务

2.1Linux/Unix/Mac

  进入到/nacos/bin目录下

  启动命令(standalone代表着单机模式运行,非集群模式):

  sh startup.sh -m standalone

  如果您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试如下运行:

  bash startup.sh -m standalone

2.2 Windows

  启动命令(standalone代表着单机模式运行,非集群模式):

  startup.cmd -m standalone

3.看到下面界面表示启动成功了

4.在浏览器查看可视化界面http://localhost:8848/nacos/   账号密码:nacos  nacos

5.nacos配制成服务使其开机自启动

先运行sh shutdown.sh关闭nacos,编辑nacos/bin/startup.sh,将JAVA_HOME修改成自己的路径,忘记了自己的路径的可以去/etc/profile看看

 新建文件nacos.service并编辑

vim /lib/systemd/system/nacos.service

将下面的复制进去,注意红色部分改成自己的nacos所在的路径

[Unit]

Description=nacos

After=network.target

[Service]

Type=forking

ExecStart=/usr/local/nacos/bin/startup.sh  #单机模式这个语句需要修改为如下ExecStart=/usr/local/nacos/bin/startup.sh -m standalone
ExecReload=/usr/local/nacos/bin/shutdown.sh  

ExecStop=/usr/local/nacos/bin/shutdown.sh

PrivateTmp=true

[Install]

WantedBy=multi-user.target

保存后执行以下命令即可

systemctl daemon-reload

systemctl enable nacos.service

systemctl start nacos.service
systemctl status nacos.service   #查看启动状态

二、项目总体结构

1.star-job:服务调用方

2.star-people:服务提供方

3.三个people搭建服务集群

 

三、搭建父工程nacos-parent

删掉src,在pom文件中导入依赖,注意版本对应关系

pom.xml

四、搭建服务提供方star-people

1.项目结构

 2.pom.xml中导入依赖

<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>

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

</dependencies>

3.application.yml配置文件

server:
  port: 6677
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: star-people

 4.controller

@RestController
public class PeopleController {
    @Value("${server.port}")
    private int port;//获取本服务端口,方便查看本服务是否被调用

    @RequestMapping("/findPeople/{id}")
    public Map<String,Object> findPeople(@PathVariable("id") int id){
        Map<String,Object> map=new HashMap<>();

        map.put("status",200);
        map.put("port",port);
        map.put("people","查到的人物id为"+id);

        return map;
    }
}

5.启动类

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

五、搭建服务调用者

1.相关依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
        </dependency>
</dependencies>

2.配置文件application.yml

server:
  port: 5566

spring:
  application:
    name: star-job
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

3.Controller服务调用

@RestController
public class JobController {
    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @RequestMapping("/getJobById/{id}")
    public Map<String,Object> getJob(@PathVariable("id") int id){


        //也可以写个配置类return new RestTemplate()后通过注解@Autowired注入
        RestTemplate rest = new RestTemplate();
        Map map = rest.getForObject("http://localhost:6677/findPeople/"+id, Map.class);
       return map;
    }
}

4.启动类

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

六、启动后测试结果可以看到调用成功

 可视化界面也有显示http://localhost:8848/nacos

 七、搭建服务集群实现负载均衡

spring-cloud-alibaba-nacos-discovery包已经集成了ribbon

1.搭建多个服务的提供方,这里将star-people多复制几份,然后修改pom.xml中的项目名字和application.yml中的port,服务名保持一样(star-people)

 

 2.修改服务调用方star-job的controller,使用DiscoveryClient或者LoadBalancerClient

@RestController
public class JobController {
    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private LoadBalancerClient loadBalancerClient;
    
    @RequestMapping("/getJobById/{id}")
    public Map<String,Object> getJob(@PathVariable("id") int id){


        //也可以写个配置类return new RestTemplate()后通过注解@Autowired注入
        RestTemplate rest = new RestTemplate();
//        Map map = rest.getForObject("http://localhost:6677/findPeople/"+id, Map.class);

//        List<ServiceInstance> instanceList = discoveryClient.getInstances("star-people");
//        for (ServiceInstance instance : instanceList) {
//            System.out.println("服务地址uri"+instance.getUri());
//        }

        ServiceInstance serviceInstance = loadBalancerClient.choose("star-people");
        System.out.println("当前处理服务的端口为"+serviceInstance.getUri());

        //调用服务提供端
        Map map = rest.getForObject(serviceInstance.getUri() + "/findPeople/"+id, Map.class);

        return map;
    }
}

3.查看nacos可视化界面可以看到集群的三个服务了

 八、测试负载均衡

启动所有服务后,访问服务的调用方star-job接口,刷新几次可以看到这三个服务的提供方依次被调用。

 控制台也有显示,至此,说明此集群已经实现了负载均衡机制。

 

-----------------------------------------2021-10-22 更新:添加配置中心-----------------------------

九、添加配置中心

作用:

一个项目在开发,测试,上线可以使用不同的配置文件application.yml

nacos只支持 .proertoes   .yaml

1.在已有项目中添加新module,如上面这个项目添加:

结构:

 

 

 2.添加依赖

         <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-nacos-config</artifactId>
        </dependency>

3.添加配置文件application.yaml

server:
  port: 7780
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: nacos-config
name: 7780哈哈哈哈哈嘎嘎嘎嘎嘎

4.启动类

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

5.在nacos可视化界面查看是否注册成功,如下表示成功

 6.在配置列表添加配置,即yaml配置文件,第一次进去为空,直接添加即可

 根据项目中application.yaml内容按照自己需求修改Port等信息,注意文件名规则,前缀保持一致

server:
  port: 7778
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: nacos-config
name: 7778大大大大大大
nacosconfig-prod.yaml
server:
  port: 7779
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: nacos-config
name: 7779发发发发发发
nacosconfig-dev.yaml
server:
  port: 7780
spring:
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
  application:
    name: nacos-config
name: 7780哈哈哈哈哈嘎嘎嘎嘎嘎
nacosconfig-test.yaml

7.删除原来application.yaml文件,新建bootstrap.yaml

spring:
  cloud:
    nacos:
      config:
        group: DEFAULT_GROUP
        prefix: nacosconfig #默认为  ${application.name}
        file-extension: yaml #内容的数据格式,只支持yaml properties
        server-addr: localhost:8848

  application:
    name: nacosconfig
  profiles:
    active: test  #当前环境

8.编写controller测试

@RestController
@RefreshScope  //开启自动刷新-当可视化界面中修改了配置文件是这里也自动获取修改后的内容
public class User {
    @Value("${server.port}")
    private int port;

    @Value("${name}")
    private String name;

    @RequestMapping("/getUser/{id}")
    public Map<String,Object> getUser(@PathVariable("id") int id){
        Map<String,Object> map=new HashMap<>();
        map.put("status",200);
        map.put("port",port);
        map.put("name",name+id);

        return map;
    }
}

9.浏览器查看结果

项目git地址:https://github.com/smiles365/nacos


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM