通过Nacos实现服务注册与发现

Spring Boot版本:2.2.9.RELEASE

Spring Cloud版本:Hoxton.SR6

Spring Cloud Alibaba版本:2.2.1.RELEASE

Nacos版本:1.3.1

0 启动nacos服务

参考 docker安装Nacos 启动一个单机版的Nacos服务。

1 服务提供者

创建一个名为nacos-discovery-serverSpring Cloud项目,向Nacos注册自己并提供服务。

1.1 引入依赖

引入spring-cloud-starter-alibaba-nacos-discovery依赖。


<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.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.2.9.RELEASEversion>
        <relativePath/> 
    parent>
    <groupId>com.taogroupId>
    <artifactId>nacos-discovery-serverartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>nacos-discovery-servername>
    <description>Demo project for Spring Bootdescription>

    <properties>
        <java.version>1.8java.version>
        <spring-cloud.version>Hoxton.SR6spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.1.RELEASEspring-cloud-alibaba.version>
    properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>${spring-cloud-alibaba.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

    <dependencies>
        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>

project>

1.2 开启服务注册

首先在启动类上面使用@EnableDiscoveryClient开启服务注册:

@EnableDiscoveryClient
@SpringBootApplication
public class NacosDiscoveryServerApplication {

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

}

然后在application.properties配置文件中配置主要的服务信息:

# 服务名、端口、上下文
spring.application.name=discoveryServer
server.port=8001
server.servlet.context-path=/ds

# nacos服务器的地址
spring.cloud.nacos.discovery.server-addr=192.168.225.128:8848

配置说明如下:

  • spring.application.name配置类服务的名称为discoveryServer
  • server.port配置了服务的端口。
  • server.servlet.context-path配置了服务的上下文。
  • spring.cloud.nacos.discovery.server-addr配置了Nacos服务的ipport,根据这项配置就能将当前服务注册到Nacos服务上面。

1.3 创建服务

定义一个简单的http服务。

@RestController
public class MainController {

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

    @GetMapping("/hello")
    public String hello() {
        return String.format("hello, I am discoveryServer, port is [%d]", port);
    }
}

1.4 启动服务,查看注册信息

启动discoveryServer服务,登录Nacos控制台页面查看服务注册信息。

通过Nacos实现服务注册与发现_第1张图片

可以看到,discoveryServer服务已经注册到Nacos上面了。

2 服务消费者

创建一个名为nacos-discovery-clientSpring Cloud项目,作为服务消费者,消费discoveryServer提供的服务。

2.1 引入依赖

同样,引入spring-cloud-starter-alibaba-nacos-discovery依赖。


<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.0modelVersion>
    <parent>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-parentartifactId>
        <version>2.2.9.RELEASEversion>
        <relativePath/> 
    parent>
    <groupId>com.taogroupId>
    <artifactId>nacos-discovery-clientartifactId>
    <version>0.0.1-SNAPSHOTversion>
    <name>nacos-discovery-clientname>
    <description>Demo project for Spring Bootdescription>

    <properties>
        <java.version>1.8java.version>
        <spring-cloud.version>Hoxton.SR6spring-cloud.version>
        <spring-cloud-alibaba.version>2.2.1.RELEASEspring-cloud-alibaba.version>
    properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloudgroupId>
                <artifactId>spring-cloud-dependenciesartifactId>
                <version>${spring-cloud.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
            <dependency>
                <groupId>com.alibaba.cloudgroupId>
                <artifactId>spring-cloud-alibaba-dependenciesartifactId>
                <version>${spring-cloud-alibaba.version}version>
                <type>pomtype>
                <scope>importscope>
            dependency>
        dependencies>
    dependencyManagement>

    <dependencies>
        
        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-webartifactId>
        dependency>
        
        <dependency>
            <groupId>com.alibaba.cloudgroupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
        dependency>
        
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-loadbalancerartifactId>
        dependency>
    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-maven-pluginartifactId>
            plugin>
        plugins>
    build>

project>

2.2 开启服务注册

首先在启动类上面使用@EnableDiscoveryClient开启服务注册:

@EnableDiscoveryClient
@SpringBootApplication
public class NacosDiscoveryClientApplication {

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

}

然后在application.properties配置文件中配置主要的服务信息:

# 服务名、端口、上下文
spring.application.name=discoveryClient
server.servlet.context-path=/dc
server.port=8080

# nacos服务器的地址
spring.cloud.nacos.discovery.server-addr=192.168.225.128:8848

# 不使用RibbonLoadBalancerClient,改用BlockingLoadBalancerClient
spring.cloud.loadbalancer.ribbon.enabled=false
  1. 按照官方说明,对于客户端负载均衡,由于Ribbon已经处于维护阶段,官方建议通过BlockingLoadBalancerClient这个官方实现去替换RibbonLoadBalancerClient实现。

  2. 如果要使用BlockingLoadBalancerClient,首先需要引入org.springframework.cloud:spring-cloud-starter-loadbalancer依赖,然后在配置文件中添加spring.cloud.loadbalancer.ribbon.enabled=false配置来禁用RibbonLoadBalancerClient。如果不禁用,官方为了向后兼容,会优先使用RibbonLoadBalancerClient

2.3 消费discoveryServer的服务

可以创建一个http服务,收到请求后将调用discoveryServer的服务,如下:

@RestController
public class MainController {

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/testHello")
    public String testHello() {
        String response = restTemplate.getForObject("http://discoveryServer/ds/hello", String.class);
        return String.format("Request forward to discoveryServer, response is [%s]", response);
    }
}

这里可以简单的使用RestTemplate来请求discoveryServer,当然也可以用feign

上边的代码中,我们并没有直接通过discoveryServeripport去请求它的接口,而是直接通过服务名去请求。

当然,RestTemplate的配置如下:

@Configuration
public class MainConfig {

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

这里使用了@LoadBalanced实现了客户端的负载均衡。

在真正调用的时候,Spring Cloud会将请求拦截下来,然后通过负载均衡器选出节点,并替换服务名部分为具体的ipport,从而实现基于服务名的负载均衡调用。

2.4 启动消费者服务

启动nacos-discovery-client服务,查看Nacos上面的注册信息:

通过Nacos实现服务注册与发现_第2张图片

可以看到,discoveryClient服务也已经注册到Nacos上面了。

3 验证服务注册与发现

通过请求discoveryClient服务的/testHello接口,可以验证discoveryServer服务是否能够被discoveryClient服务发现。

请求在浏览器中输入请求的url

http://localhost:8080/dc/testHello

通过Nacos实现服务注册与发现_第3张图片

通过输出的响应结果可以看出,discoveryClient确实能够发现discoveryServer服务,并能够成功调用http://discoveryServer/ds/hello请求,得到响应结果。

你可能感兴趣的:(Spring,Cloud)