SpringCloudAlibaba快速入门(1)基于Nacos实现服务注册与发现

快速入门

安装 Nacos

下载地址:https://github.com/alibaba/nacos/releases
本文版本:1.2.1

下载完成之后,解压,在 bin 目录下有启动程序。

  • window:startup.cmd
  • linux:startup.sh

启动之后,访问 http://localhost:8848/nacos/,进入 Nacos 的登录界面,默认用户名密码为:nacos,登录之后进入管理界面
在这里插入图片描述

构建应用接入 Nacos

构建一个服务提供者以及一个服务消费者来验证服务的注册与发现

构建服务提供者

需要有 SpringBoot 基础

第一步:创建一个新的 SpringBoot 应用,命名为 nacos-provider

第二步:添加依赖

添加父依赖

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

添加依赖管理器

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Finchley.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>0.2.2.RELEASE</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

添加依赖

<dependencies>
    <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>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

第三步:创建启动类并提供一个应用接口

@EnableDiscoveryClient
@SpringBootApplication
public class Application {

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

    @Slf4j
    @RestController
    static class TestController {
        @GetMapping("/hello")
        public String hello(@RequestParam String name) {
            log.info("execute hello method with name : " + name);
            return "hello " + name;
        }
    }
}
  • @SpringBootApplication 用于定义 SpringBoot 应用的启动类
  • @EnableDiscoveryClient Spring Cloud 提供的注解,用于开启 Spring Cloud 的服务注册与发现,
    由于这里引入了 spring-cloud-starter-alibaba-nacos-discovery,所以服务注册与发现会使用 Nacos 的实现。
    这与 Eureka 或者 Consul 的操作是一样的。

第四步:配置服务名称及 Nacos 地址

server:
  port: 8080
spring:
  application:
    name: nacos-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

第五步:启动应用

如果打印如下日志,表示注册成功

nacos registry, nacos-provider 10.32.52.236:8080 register finished

修改端口号,同一个应用启动多个实例,实现集群

访问 Nacos 管理界面,通过 服务管理 \> 服务列表 界面查看已注册的服务
服务列表

点击详情,可以查看集群中每个服务实例的具体信息
服务详情

构建服务消费者

第一步:创建一个新的 SpringBoot 应用,命名为 nacos-consumer

第二步:添加依赖,与上面的构建服务提供者的内容一样

第三步:创建启动类并提供一个应用接口,在该接口实现对服务提供者提供的接口进行调用

@EnableDiscoveryClient
@SpringBootApplication
public class Application {

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

    @Slf4j
    @RestController
    static class TestController {
        @Autowired
        LoadBalancerClient loadBalancerClient;
        
        @GetMapping("/test")
        public String test() {
            ServiceInstance serviceInstance = loadBalancerClient.choose("nacos-provider");
            String url = serviceInstance.getUri() + "/hello?name=" + "nacos";
            RestTemplate restTemplate = new RestTemplate();
            String result = restTemplate.getForObject(url, String.class);
            return "Invoke : " + url + ", return : " + result;
        }
    }
}

这里使用了 Spring Cloud Common 中的 LoadBalancerClient 接口来挑选服务实例信息,使用负载均衡的算法,
然后获取被选中实例的URI,拼接上服务提供者接口的请求地址及参数,使用 RestTemplate 进行调用。

第四步:配置服务名称及 Nacos 地址

跟上面的配置服务提供者基本一致,只是服务名及端口根据需要进行修改

server:
  port: 8082
spring:
  application:
    name: nacos-consumer
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848

第五步:启动服务

访问地址 http://localhost:8082/test,查看日志输出

Invoke : http://10.32.52.236:8080/hello?name=nacos, return : hello nacos
Invoke : http://10.32.52.236:8081/hello?name=nacos, return : hello nacos
Invoke : http://10.32.52.236:8080/hello?name=nacos, return : hello nacos
Invoke : http://10.32.52.236:8081/hello?name=nacos, return : hello nacos

可以看到,多次请求会被依次分配给 nacos-provider 服务集群中的两个实例,可以分别查看两个实例的日志输出进行验证

其它服务间通信方式

使用RestTemplate

第一步:注册

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

@LoadBalanced 注解标记负载均衡

第二步:使用

@RestController
static class TestController {

    @Autowired
    RestTemplate restTemplate;

    @GetMapping("/test")
    public String test() {
        String result = restTemplate.getForObject("http://nacos-provider/hello?name=nacos", String.class);
        return "Return : " + result;
    }
}

请求地址中,直接使用服务名代替 Host 部分,在真正调用时,SpringCloud 会将请求拦截,然后通过负载均衡器选出节点,并替换为具体节点的IP与端口执行调用。

使用WebClient

第一步:注册

@Bean
@LoadBalanced
public WebClient.Builder loadBalancedWebClientBuilder() {
    return WebClient.builder();
}

@LoadBalanced 注解标记负载均衡,其原理与之前的RestTemplate时一样的。

第二步:使用

@Slf4j
@RestController
static class TestController {

    @Autowired
    private WebClient.Builder webClientBuilder;

    @GetMapping("/test")
    public Mono<String> test() {
        Mono<String> result = webClientBuilder.build()
                .get()
                .uri("http://nacos-provider/hello?name=nacos")
                .retrieve()
                .bodyToMono(String.class);
        return result;
    }
}
使用Feign

第一步:消费者服务添加对 feign 的依赖

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

第二步:修改服务启动类,开启 Feign 客户端功能,并定义客户端

@EnableDiscoveryClient
@SpringBootApplication
@EnableFeignClients
public class Application {

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

    @FeignClient("nacos-provider")
    public static interface Client {

        @GetMapping("/hello")
        String hello(@RequestParam String name);
    }
}
  • @EnableFeignClients 注解用于开启扫描 Feign 客户端的功能
  • @FeignClient 注解用于定义 Feign 客户端,需要指定这个接口所要调用的服务名称,
    接口中定义的方法使用 Spring MVC 的注解就可以来绑定服务提供方的 REST 接口。

注意:如果是 get 请求方式,@RequestParam 必须要带,否则 get 请求会被转换成 post 请求导致请求失效

第三步:通过 Spring 容器注入接口对象,直接调用

@RestController
public class FeignConsumerController {
    @Autowired
    private Application.Client client;

    @GetMapping("/testWithFeign")
    public String test() {
        String result = client.hello("haha");
        return "result : " + result;
    }
}

优点:强类型检查

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章