Spring Cloud Alibaba基础教程(1)---使用nacos服务注册与发现

目录

1、什么是Nacos

1.1、概述

1.2、Nacos关键特性包括:

1.3、Nacos下载安装

2、使用Nacos服务注册和发现

2.1、项目实践

2.1.1、项目介绍

2.1.2、服务提供者

2.1.3、服务消费者

2.2、启动并验证

2.2.1、查看服务列表

2.2.2、访问消费接口


1、什么是Nacos

1.1、概述

欢迎来到Nacos的世界!

Nacos致力于帮助您发现、配置和管理微服务。Nacos提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

Nacos帮助您更敏捷和更容易的构建、交付和管理微服务平台。Nacos是以构建“服务”为中心的现代化应用架构(例如微服务范式,云原生范式)的服务基础设备。

参考资料:

1.2、Nacos关键特性包括:

  • 服务发现和服务健康监测
  • 动态配置服务,带管理界面,支持丰富的配置维度
  • 动态 DNS 服务
  • 服务及其元数据管理

1.3、Nacos下载安装

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境。然后从官网下载Nacos的解压包,安装稳定版的,下载地址:https://github.com/alibaba/nacos/releases

本次下载的版本是1.1.4,下载完成后进行解压。在解压的目录/bin下,windows系统点击startup.cmd就可以启动nacos,Linux或mac执行命令即可启动单机版Nacos服务。

sh startup.sh -m standalone

启动完成之后,访问:http://127.0.0.1:8848/nacos/,默认的登陆用户名为nacos,密码也为nacos。进入Nacos的服务管理页面,成功如下:

界面可知道,此时没有服务注册到Nacos上。

参考资料:

2、使用Nacos服务注册和发现

服务注册和发现是微服务治理的根基,服务注册和发现组件是整个微服务系统的灵魂,选择合适的服务注册和发现组件至关重要,目前主流的服务注册和发现组件有Consul、Eureka、Etcd等。 随着Eureka的闭源,Spring cloud netflix-oss组件大规模的进入到了维护期,不再提供新功能,spring cloud alibaba受到开源社区的大力拥护。

2.1、项目实践

2.1.1、项目介绍

本次创建一个项目springcloud-alibaba-project,其中包含两个module:

  • service-nacos-provider:服务提供者
  • service-nacos-consumer:服务消费者

项目提示:完全可以创建多个项目,这里为了方便管理使用多个module模式。

2.1.2、服务提供者

在service-provider模块引入相关依赖、配置服务信息及nacos地址、在主类上添加服务发现注解、创建一个普通的接口。

1、首先创建一个maven主工程:SpringCloud-Alibaba-Project,Spring boot版本为2.1.6.RELEASE,Spring Cloud 版本为Greenwich.SR1,创建完后的工程的pom.xml文件如下:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <!--新建Maven项目:springcloud,切记Packageing是pom模式-->
    <!--主要是定义POM文件,将后续各个子模块公用的jar包等统一提取出来,类似一个抽象父-->
    <groupId>com.boyue</groupId>
    <artifactId>SpringCloud-Alibaba-Project</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>service-nacos-provider</module>
        <module>service-nacos-consumer</module>
    </modules>

    <!--springcloud项目依赖于springboot,-->
    <!--springboot项目三要素之一,parent依赖-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.6.RELEASE</version>
    </parent>

    <dependencyManagement>
        <dependencies>
            <!--SpringCloud依赖-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--Springboot依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.6.RELEASE</version>
            </dependency>

        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <!--springboot三要素之一:spring-boot-maven-plugin插件-->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

2、在主工程下创建一个module:service-nacos-provider。pom.xml导入依赖:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringCloud-Alibaba-Project</artifactId>
        <groupId>com.boyue</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>service-nacos-provider</artifactId>

    <dependencies>
        <!--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.1.RELEASE</version>
        </dependency>
        <!--slf4j日志 依赖-->
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-api</artifactId>
            <version>1.7.25</version>
        </dependency>
    </dependencies>

</project>

3、在工程的配置文件application.yml做相关的配置,配置如下:

server:
  port: 9100
  
#  服务的name
spring:
  application:
    name: SERVICE-NACOS-PROVIDER
  cloud:
    nacos:
      discovery:
#        配置nacos的地址
        server-addr: localhost:8848

4、在springboot工程的启动类上添加注解@EnableDiscoveryClient:

@SpringBootApplication
@EnableDiscoveryClient
public class ServiceNacosProvider {
    /**
     * 1、@SpringBootApplication注解开启 Springboot应用
     * 2、@EnableDiscoveryClient注解开启 服务的注册与发现
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(ServiceNacosProvider.class,args);
    }


}

5、编写服务提供的一个普通接口:

@RestController
@RequestMapping("/service-provider")
public class ServiceInfoController {
    private static Logger logger=LoggerFactory.getLogger(ServiceInfoController.class);

    @Value("${server.port}")
    private String serverPort;

    @GetMapping("/ServerInfo")
    public RespBean serverInfo(){
        logger.info("hello,该服务信息端口为:"+serverPort);
        return RespBean.ok("hello,该服务信息端口为:"+serverPort);
    }

}

2.1.3、服务消费者

在service-nacos-consumer引入相关依赖、配置服务信息及nacos地址、在主类上添加服务发现注解、调用服务提供者接口:(大体跟提供者一样)

1、在主工程下创建一个module:service-nacos-consumer。使用RestTemplate消费服务和FeignClient调用服务,pom.xml导入依赖:

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>SpringCloud-Alibaba-Project</artifactId>
        <groupId>com.boyue</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>service-nacos-consumer</artifactId>

    <dependencies>
        <!--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.1.RELEASE</version>
        </dependency>
        <!--ribbon 依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>
        <!--feign 依赖,feign自动集成了ribbon,hystrix-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>
    </dependencies>
</project>

2、在工程的配置文件application.yml做相关的配置,配置如下:

server:
  port: 9101
#服务的name,服务之间调用使用
spring:
  application:
    name: SERVICE-NACOS-CONSUMER
  cloud:
    nacos:
      discovery:
#        配置nacos server的地址信息
        server-addr: localhost:8848

3、添加服务发现注解,在主类添加@EnableDiscoveryClient,并添加RestTemplate bean,用于请求调用。

@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class ServiceNacosConsumer {
    /**
     * 1、@SpringBootApplication注解开启 Springboot应用
     * 2、@EnableDiscoveryClient注解开启 服务的注册与发现
     * 3、@EnableFeignClients 开启feign组件
     * @param args
     */
    public static void main(String[] args) {
        SpringApplication.run(ServiceNacosConsumer.class,args);
    }

    /**
     * restTemplate+Ribbon方式调用,开启负载均衡
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}

4、在这里使用2种方式消费服务,一种是RestTemplate,一种是Feign。

使用Ribbon+RestTemplate来消费服务,在测试类RibbonTestService中通过注入RestTemplate来消费服务SERVICE-NACOS-PROVIDER的接口。


@Service
public class RibbonTestServiceImpl implements RibbonTestService {

    @Autowired
    private RestTemplate restTemplate;
    @Override
    public RespBean getInfo() {
 //        通过之前注入ioc容器的restTemplate来消费eureka-client服务的“/info”接口,
//        在这里我们直接用的程序名替代了具体的url地址,
//        在ribbon中它会根据服务名来选择具体的服务实例,
//        根据服务实例在请求的时候会用具体的url替换掉服务名
        return restTemplate.getForObject("http://SERVICE-NACOS-PROVIDER/service-provider/ServerInfo",RespBean.class);
    }
}

Ribbon消费服务的Controller具体接口:

@RestController
@RequestMapping("/RibbonTest")
public class RestTempleController {

    @Autowired
    private RibbonTestService ribbonTestService;
    @GetMapping("/getInfo")
    public RespBean getInfo(){
        return ribbonTestService.getInfo();
    }

}

FeignClient调用服务,定义一个feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务:

@FeignClient(value = "SERVICE-NACOS-PROVIDER")
public interface FeignTestService {
    @GetMapping("/service-provider/ServerInfo")
    RespBean getInfoTwo();
//    一、Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。
//    使用Feign,只需要创建一个接口并注解。
//    二、定义一个feign接口,通过@ FeignClient(“服务名”),来指定调用哪个服务
    /*1、Feign 采用的是基于接口的注解
      2、Feign 整合了ribbon,具有负载均衡的能力
      3、整合了Hystrix,具有熔断的能力*/
}

Feign调用服务的Controller具体接口:


@RestController
@RequestMapping("/FeignTest")
public class FeignTestController {
    @Autowired(required = false)
    private FeignTestService feignTestService;

    @GetMapping("/getInfoTwo")
    public RespBean getInfoTwo(){
        return feignTestService.getInfoTwo();
    }
}

2.2、启动并验证

2.2.1、查看服务列表

分别启动服务提供者(此服务多端口启动)、服务消费者,打开nacos页面查看服务列表。

点击详情,我们还能看到每个服务具体的实例信息,如下图所示:

 

2.2.2、访问消费接口

浏览器输入地址:http://localhost:9101/RibbonTest/getInfo 和 http://localhost:9101/FeignTest/getInfoTwo 可以看到接口的返回信息。


扫码关注微信公众号:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值