Nacos笔记01——使用Nacos作为SpringCloud项目的服务注册中心

前言

刚学SpringCloud时使用eureka作为服务注册中心,随着网飞公司eureka2.x不再更新,以及最近在公司实习接触到的SpringCloud项目是使用Nacos来做服务注册中心的,所以决定学习一波,并记录一下。

Nacos是什么

Nacos是阿里巴巴的一个开源的SpringCloud项目的服务注册中心主键,但是Nacos又不仅仅是注册中心,同时可以做配置中心,将项目的配置文件版本化管理,Nacos可以无缝接入各大生态。很强大,马上来体验一下。

环境

  • Nacos-server:1.0.1
  • SpringCloud:Finchley.RELEASE
  • SpringBoot:2.0.6.RELEASE
  • spring-cloud-alibaba-dependencies:0.2.2.RELEASE

要注意spring-cloud-alibaba、SpringBoot、SpringCloud、Nacos-server四者之间版本的关系,避免出现版本冲突。可以参考下表:

SpringBoot SpringCloud spring-cloud-alibaba Nacos-server
2.1.x Greenwich 0.9.x 1.1.4
2.0.x Finchley 0.2.x 1.0.0
1.5.x Edgware、Dalston 0.1.x 1.0.0及以下

具体可参考:

https://blog.csdn.net/sq4521/article/details/90417562

https://github.com/alibaba/spring-cloud-alibaba/wiki/版本说明

https://www.cnblogs.com/didispace/p/10464188.html

启动Nacos-server

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

下载解压之后进入bin文件夹双击startup.cmd启动。启动成功后在http://127.0.0.1:8848/nacos/index.html 访问控制台,默认账号密码是nacos/nacos。

nacos控制台.png

创建工程

父工程

先创建nacos-modules作为父工程,主要做版本管理。pom依赖如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <packaging>pom</packaging>
    <groupId>com.my</groupId>
    <artifactId>nacos-modules</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-modules</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <spring.cloud.version>Finchley.RELEASE</spring.cloud.version>
        <spring.cloud.alibaba.version>0.2.2.RELEASE</spring.cloud.alibaba.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring.cloud.version}</version>
                <!--相当于parent标签-->
                <!--下面两行相当于引入这个pom文件,里面的dependencyManagement定义了很多依赖,我们可以选择性的继承。解决单继承问题-->
                <!--因为里面的parent是cloud-parent,子工程就可以直接用cloud的东西了-->
                <!--如果是引进来的pom有dependencies里面的会直接继承给子工程-->
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.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>
</project>

服务提供者

再创建一个maven工程nacos-provider,在nacos-modles把nacos-provider引进来,操作如下:

引进子工程.jpg

nacos-provider的pom依赖如下:

    <?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.my</groupId>
        <artifactId>nacos-modules</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <artifactId>nacos-provider</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-provider</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <!--在父工程spring-cloud-alibaba-dependencies的management中有声明,所以不用版本号-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
<!--                需要打包成jar的模块才需要这个插件-->
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

在启动类加@EnableDiscoveryClient启动服务注册发现功能。

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {

    public static void main(String[] args) {
        SpringApplication.run(NacosConsumerApplication.class, args);
    }
}

创建配置文件application.yml

server:
  port: 8000
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

创建一个controller提供服务

@RestController
@RequestMapping("/test")
public class testController {

    @GetMapping("/hello")
    public String sayHello() {
        return "雷猴啊";
    }
}

服务消费者

再创建一个服务消费者,步骤与创建服务提供者一样。

pom如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.my</groupId>
        <artifactId>nacos-modules</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <artifactId>nacos-consumer</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>nacos-consumer</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

配置文件:

server:
  port: 8010
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848

RestTemplate+Ribbon服务调用

@RestController
@RequestMapping("/test")
public class controller {

    @Autowired
    private RestTemplate restTemplate;
    
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

    @GetMapping("/hello")
    public String sayHello() {
        return restTemplate.getForObject("http://nacos-provider/test/hello", String.class);
    }
}

feign方式服务调用

在实际开发,服务调用用的更多的还是Feign,Feign内部集成了Ribbon和Hystrix,使用起来更加方便好用。

  1. 在nacos-consumer添加依赖:
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
        </dependency>
  1. 添加配置开启Hystrix

    feign:
      hystrix:
        enabled: true
  2. 启动类加@EnableFeignClients注解,开启Feign。

  3. 创建Feign接口

    name为调用的服务名,path是url前缀,fallback是熔断调用的类

@FeignClient(name = "nacos-provider",path = "/test",fallback = MyHystrix.class)
public interface TestFeignClient {
    @GetMapping("/hello")
    String sayHello();
}
  1. 创建Hystrix熔断和降级处理的类
@Component
public class MyHystrix implements TestFeignClient {
    @Override
    public String sayHello() {
        return "服务超时";
    }
}
  1. controller
@RestController
@RequestMapping("/feign/test")
public class FeignController {
    @Autowired
    TestFeignClient testFeignClient;

    @GetMapping("/hello")
    public String sayHello() {
        return testFeignClient.sayHello();
    }
}

启动项目

启动nacos-provider和nacos-consumer,成功的话可以在nacos控制台看到:

服务列表.png

测试

http://localhost:8010/feign/test/hello

http://localhost:8010/test/hello

测试.png

模拟异常,降级处理

  1. 修改服务提供者

    @RestController
    @RequestMapping("/test")
    public class testController {
    
        @GetMapping("/hello")
        public String sayHello() {
            int i=1/0;
            return "雷猴啊";
        }
    }
  2. 结果

熔断.png

总结

这次是使用Nacos作为注册中心,我们上面说到,Nacos不仅仅可以做注册中心,还能做配置中心,我们下一次就来试一下用Nacos做配置中心。

猜你喜欢

转载自www.cnblogs.com/Jotal/p/12082874.html