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