基于Spring Cloud架构应用Spring Cloud Alibaba Nacos

记录:296

场景:基于Spring Cloud架构应用Nacos,版本2.1.0。包括Nacos部署、微服务集成Nacos,微服务注册、微服务配置、微服务调用(RestTemplate和Spring Cloud OpenFeign)。

版本:

JDK 1.8
Spring Boot 2.6.3
Spring Cloud 2021.0.1
Spring Cloud Alibaba 2021.0.1.0
nacos-server-2.1.0

名词:

以下摘自官网。

Nacos: Dynamic Naming and Configuration Service.

Nacos (official site: nacos.io) is an easy-to-use platform designed for dynamic service discovery and configuration and service management. It helps you to build cloud native applications and microservices platform easily.

一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Service is a first-class citizen in Nacos. Nacos supports almost all type of services,for example,Dubbo/gRPC service, Spring Cloud RESTFul service or Kubernetes service.

一、基础

1.Nacos相关地址

(1)官网地址

https://nacos.io/zh-cn/

(2)开源地址

https://github.com/alibaba/Nacos

(3)下载地址

https://github.com/alibaba/nacos/releases

2.Nacos基础

Nacos:一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。

Nacos的四个主要功能(摘自官网):

(1)Service Discovery and Service Health Check.服务发现与服务监控检查。

(2)Dynamic Configuration Management.动态配置管理。

(3)Dynamic DNS Service.动态DNS服务。

(4)Service and MetaData Management.服务和元数据管理。

二、部署Nacos

本例使用nacos-server-2.1.0,请到官网下载。

部署Nacos要做四件事:第一件,到官网下载nacos对应版本的包;第二件,根据nacos提供的SQL脚本初始化数据库相应的表及其数据。第三件,修改application.properties配置,比如数据库连接信息。第四件,使用\bin目录脚本,启动nacos。

1.下载包nacos-server-2.1.0介绍

下载nacos-server-2.1.0.zip。解压后,目录下包括\bin;\conf;\target;以及LICENSE和NOTICE文件。

1.1 bin目录

在\bin目录中,包括启动和关闭脚本,startup是启动脚本,shutdown是关闭脚本。其中.sh是Linux环境脚本,在Windows环境中使用.cmd脚本。

1.2 conf目录

在\conf目录中,包括nacos应用的相关配置。application.properties,它是nacos应用暴露给使用者的基础配置。使用者可以按需修改。nacos-mysql.sql是nacos启动的数据库脚本。本例只关注这两个文件。

1.3 target目录

在\target目录,nacos-server.jar就是nacos的可执行jar包,自带Tomcat容器。

2.初始化数据库脚本

表结构位置:nacos\conf\nacos-mysql.sql

2.1创建数据库

本例数据库名称:hub_nacos

用户名/口令:hub_nacos/******

2.2初始化SQL脚本

把nacos\conf\nacos-mysql.sql的脚本在hub_nacos数据库中完成初始化。

2.3初始化后表清单

在hub_nacos库中,使用如下SQL查看表清单。

SELECT * FROM information_schema.TABLES aa
WHERE aa.TABLE_SCHEMA = 'hub_nacos';

在hub_nacos库中,表清单。

3.修改application.properties配置

3.1 application.properties说明

在application.properties中,可以按需修改nacos微应用的配置,比如server的contextPath或者port等。

3.2修改数据库连接信息

在application.properties修改数据库连信息。在默认状态下,application.properties中如下信息是使用#号注释的,因此需放开注释,同时按需修改指定的数据库名称、用户名称以及口令。本例配置如下。

#数据源使用MySQL
spring.datasource.platform=mysql
db.num=1
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos

4.启动Nacos

本例的bin位置在nacos\bin下,在windows环境下打开cmd.exe,进入到nacos\bin目录。

4.1单机版启动命令

startup.cmd -m standalone

4.2单机版启动成功截图

从日志:Tomcat started on port(s): 8848 (http) with context path '/nacos'.确认服务启动成功。

如下,启动截图。

5.访问Nacos

Nacos提供了浏览器端的dashboard,便于操作和使用。

5.1默认登入信息

地址: http://localhost:8848/nacos

用户/口令: nacos/nacos

5.2登录页面

登录页面

 5.3登录首页

使用默认nacos/nacos,登录首页。

 三、Nacos应用

本例使用Nacos指定的命名空间。

1.菜单介绍

Nacos左侧导航栏,包括配置管理、服务管理、权限管理、命令空间、集群管理。

配置管理/配置列表:展现已经加载到Nacos的配置。

配置管理/服务列表:展现已经注册到Nacos的微服务。

命名空间:创建命名空间和管理命名空间。默认有一个public。

2.新建命名空间

2.1进入命名空间页面

命名空间页面。

 2.2创建命名空间

创建命名空间。

 2.3 hub命名空间

创建完成hub命名空间。创建完成后:e8556e14-61e4-482b-b979-2230e00d1442。

 2.4配置列表中的命名空间

在配置管理/配置列表中,已经多了hub空间。

3.查看命名空间

3.1命名空间页面

从左侧导航栏,进入命名空间菜单,查命名空间详细信息。可以对已经新建成功的命名空间做编辑、删除等操作。其中,public命名空间只能查看。

 3.2数据库表中

新建成功的命名空间在数据库表:tenant_info。

4.新建配置

本例在hub命名空间新建配置config-hub.yaml,内容是:

hub:
  msg: This is from Nacos config.

4.1选择命名空间

在配置管理/配置列表中,选择hub命名空间如图。

 4.2填写配置

填写配置信息。

 4.3发布配置

点击发布,就发布配置成功。

 4.4持久化配置

新建配置并发布成功后,配置信息会持久化到MySQL数据中。只要没有做删除操作情况下,当Nacos关闭并重启后,会自动从数据库加载历史已近发布的配置。

5.查看配置

查看配置可以从两个路口查看,一是Nacos的dashboard;二是数据库表。

5.1 Nacos的dashboard

在Nacos的dashboard中,可以做新建、修改、删除、发布、克隆、导出等操作。实际开发过程中,推荐使用图形化界面操作。

从配置管理/配置列表进入界面。

 5.2数据库表

当前生效的配置信息分布在表:config_info中;历史配置信息分布在表:his_config_info。可以直接在MySQL的客户端中使用SQL语句查询配置信息

四、微服务

微服务工程名:example-201-nacos。微服务以Spring Boot 2.6.3、Spring Cloud 2021.0.1、Spring Cloud Alibaba 2021.0.1.0为基础构建。

搭建多模块微服务项目,可以参考如下博文。

博文:基于Maven和IntelliJ IDEA搭建多模块微服务项目(工程)

地址

https://blog.csdn.net/zhangbeizhen18/article/details/125825806

1.微服务example-201-nacos

在微服务example-201-nacos中,实现微服务注册与动态加载配置。

1.1创建微服务工程

微服务工程名:example-201-nacos。

1.2.pom.xml依赖

在pom.xml中引入核心依赖。包括spring-boot、spring-cloud、spring-cloud、nacos等。

<!--Spring Boot依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>${spring.boot.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--Spring Cloud依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>${spring.cloud.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--Spring Cloud Alibaba依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring.cloud.alibaba.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!-- Nacos配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- Nacos注册中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- loadbalancer负载均衡 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--高版本优先加载bootstrap.yml,需添加依赖,因高版本把Bootstrap被默认禁用-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--Spring Web依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

1.3.启动类

包名全路径:com.hub.example。

启动类名称:NacosExampleApplication。

注解@SpringBootApplication:代表NacosExampleApplication是微服务启动类。

注解@EnableDiscoveryClient:代表启用服务注册与发现。

package com.hub.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosExampleApplication {
  public static void main(String[] args) {
    SpringApplication.run(NacosExampleApplication.class);
  }
}

1.4业务类

1.4.1业务Controller类

包名全路径:com.hub.example.controller。

Controller类名称:HubController。

注解@RestController、@RequestMapping、@PostMapping、@GetMapping :代表Spring Web发布RestFul请求服务的注解。

注解@RefreshScope、@Value配合使用,用来验证实时从Nacos的配置中心加载实时发布的配置。

package com.hub.example.controller;
import com.hub.example.domain.CityBO;
import com.hub.example.domain.ResultMap;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.*;
import java.util.UUID;
/**
 * POST请求
 * http://127.0.0.1:18080/center/hub/getInfo
 * 请求Json格式数据  {"cityName":"杭州","randomNo":"310000"}
 * Get请求
 * http://127.0.0.1:18080/center/hub/getConfig
 * @date: 2022-09-25 22:19
 */
// 从配置中心加载的配置中取值
@RefreshScope
@Slf4j
@RestController
@RequestMapping("/hub")
public class HubController {
  // 从配置中心加载的配置中取值
  @Value("${hub.msg}")
  private String hubMessage;
  @PostMapping("/getInfo")
  public ResultMap getInfo(@RequestBody CityBO cityBO) {
    log.info("HubController->getInfo接收cityBO = " + cityBO);
    ResultMap resultMap = new ResultMap();
    resultMap.put("cityName", cityBO.getCityName());
    resultMap.put("randomNo", cityBO.getRandomNo());
    resultMap.put("randomUUID", UUID.randomUUID().toString());
    log.info("HubController->getInfo返回resultMap = " + resultMap);
    return resultMap;
  }
  @GetMapping ("/getConfig")
  public ResultMap getConfig() {
    log.info("HubController->getConfig开始执行.");
    ResultMap resultMap = new ResultMap();
    resultMap.put("hubMessage", hubMessage);
    log.info("HubController->getConfig返回resultMap=" + resultMap);
    return resultMap;
  }
}

1.5配置类

无。

1.6配置文件

在\src\main\resources\目录下添加bootstrap.yml和application.yml。

微服务启动时,优先加载bootstrap.yml文件,并从Nacos服务器中加载配置到本地。

1.6.1 bootstrap.yml

bootstrap.yml内容如下:

server:
  port: 18080
  servlet:
    context-path: /center
spring:
  application:
    # 微服务名称,从pom文件的artifactId标签取值
    name: @artifactId@
  cloud:
    nacos:
      # 服务发现,微服务名称,主机IP和端口,命名空间ID
      discovery:
        service: ${spring.application.name}
        server-addr: localhost:8848
        namespace: e8556e14-61e4-482b-b979-2230e00d1442
      # 服务配置,主机IP和端口,命名空间ID,文件后缀,配置信息(数据ID,刷新方式,分组名称)
      config:
        server-addr: localhost:8848
        namespace: e8556e14-61e4-482b-b979-2230e00d1442
        file-extension: yaml
        shared-configs:
          - data-id: config-hub.yaml
            refresh: true
            group: DEFAULT_GROUP

1.6.2 application.yml

application.yml,把此文件需要的内容都可以移到Nacos的配置中心。

2.微服务example-201-client-rest

2.1创建微服务工程

微服务工程名:example-201-client-rest。

2.2 pom.xml依赖

在pom.xml中引入核心依赖。包括spring-boot、spring-cloud、spring-cloud、nacos等。

<!--Spring Boot依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>${spring.boot.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--Spring Cloud依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>${spring.cloud.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--Spring Cloud Alibaba依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring.cloud.alibaba.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!-- Nacos配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- Nacos注册中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- loadbalancer负载均衡 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--高版本优先加载bootstrap.yml,需添加依赖,因高版本把Bootstrap被默认禁用-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--Spring Web依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

2.3启动类

包名全路径:com.hub.example。

启动类名称:RestExampleApplication。

注解@SpringBootApplication:代表RestExampleApplication是微服务启动类。

注解@EnableDiscoveryClient:代表启用服务注册与发现。

package com.hub.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class RestExampleApplication {
  public static void main(String[] args) {
    SpringApplication.run(RestExampleApplication.class);
  }
}

2.4业务类

2.4.1 Controller

包名全路径:com.hub.example.controller。

Controller类名称:RestHubController。

注解@RestController、@RequestMapping、@PostMapping、@GetMapping :代表Spring Web发布RestFul请求服务的注解。

注解@Value:用来从.yml配置文件中获取配置信息。

/**
 * POST请求
 * http://127.0.0.1:19090/rest/restHub/getInfo
 * 请求Json格式数据  {"cityName":"杭州","cityNo":"310000"}
 */
@Slf4j
@RestController
@RequestMapping("/restHub")
public class RestHubController {
  @Value("${hub.microServiceUrl}")
  private String microServiceUrl;
  @Autowired
  private RestTemplate restTp;
  @PostMapping("/getInfo")
  public ResultMap getInfo(@RequestBody CityVO cityVO) {
   log.info("RestHubController->getInfo接收cityVO = " + cityVO);
   CityBO cityBO = new CityBO();
   cityBO.setCityName(cityVO.getCityName());
   cityBO.setCityNo(cityVO.getCityNo());
   ResultMap resultMap = restTp.postForObject(microServiceUrl + "/center/hub/getInfo", cityBO, ResultMap.class);
   log.info("RestHubController->getInfo返回resultMap = " + resultMap);
   return resultMap;
  }
}

2.5配置类

2.5.1 RestConfig

在RestConfig配置类中,初始化RestTemplate对象。

package com.hub.example.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestConfig {
  @LoadBalanced
  @Bean
  public RestTemplate getRestTemplate() {
      return new RestTemplate();
  }
}

2.6配置文件

在\src\main\resources\目录下添加bootstrap.yml和application.yml。

微服务启动时,优先加载bootstrap.yml文件,并从Nacos服务器中加载配置到本地。

2.6.1 bootstrap.yml

bootstrap.yml内容如下:

server:
  port: 19090
  servlet:
    context-path: /rest
spring:
  application:
    # 微服务名称,从pom文件的artifactId标签取值
    name: @artifactId@
  cloud:
    nacos:
      # 服务发现,微服务名称,主机IP和端口,命名空间ID
      discovery:
        service: ${spring.application.name}
        server-addr: localhost:8848
        namespace: e8556e14-61e4-482b-b979-2230e00d1442
      # 服务配置,主机IP和端口,命名空间ID,文件后缀,配置信息(数据ID,刷新方式,分组名称)
      config:
        server-addr: localhost:8848
        namespace: e8556e14-61e4-482b-b979-2230e00d1442
        file-extension: yaml
        shared-configs:
          - data-id: config-hub.yaml
            refresh: true
            group: DEFAULT_GROUP
hub:
  microServiceUrl: http://example-201-nacos

3.微服务example-201-client-feign

3.1创建微服务工程

微服务工程名:example-201-client-feign。

3.2 pom.xml依赖

在pom.xml中引入核心依赖。包括spring-boot、spring-cloud、spring-cloud、nacos等。

<!--Spring Boot依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>${spring.boot.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--Spring Cloud依赖-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-dependencies</artifactId>
    <version>${spring.cloud.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!--Spring Cloud Alibaba依赖-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-alibaba-dependencies</artifactId>
    <version>${spring.cloud.alibaba.version}</version>
    <type>pom</type>
    <scope>import</scope>
</dependency>
<!-- Nacos配置中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!-- Nacos注册中心 -->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </exclusion>
    </exclusions>
</dependency>
<!-- loadbalancer负载均衡 -->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
<!--高版本优先加载bootstrap.yml,需添加依赖,因高版本把Bootstrap被默认禁用-->
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-bootstrap</artifactId>
</dependency>
<!--Spring Web依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--Spring Cloud OpenFeign依赖-->
<dependency>
  <groupId>org.springframework.cloud</groupId>
  <artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

3.3启动类

包名全路径:com.hub.example。

启动类名称:FeignExampleApplication。

注解@SpringBootApplication:代表FeignExampleApplication是微服务启动类。

注解@EnableDiscoveryClient:代表启用服务注册与发现。

注解@EnableFeignClients:代表启动Spring Cloud OpenFeign。

package com.hub.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignExampleApplication {
  public static void main(String[] args) {
    SpringApplication.run(FeignExampleApplication.class);
  }
}

3.4业务类

3.4.1 Controller

包名全路径:com.hub.example.controller。

Controller类名称:FeignHubController。

注解@RestController、@RequestMapping、@PostMapping、@GetMapping :代表Spring Web发布RestFul请求服务的注解。

注解@Autowired:注入实例。

/**
 * POST请求
 * http://127.0.0.1:19091/feign/feignHub/getInfo
 * 请求Json格式数据  {"cityName":"苏州","cityNo":"215000"}
 */
@Slf4j
@RestController
@RequestMapping("/feignHub")
public class FeignHubController {
  @Autowired
  private HubOpenFeignClient feignClient;
  @PostMapping("/getInfo")
  public ResultMap getInfo(@RequestBody CityVO cityVO) {
    log.info("FeignHubController->getInfo接收cityVO = " + cityVO);
    CityBO cityBO = new CityBO();
    cityBO.setCityName(cityVO.getCityName());
    cityBO.setCityNo(cityVO.getCityNo());
    ResultMap resultMap = feignClient.getInfo(cityBO);
    log.info("FeignHubController->getInfo返回resultMap = " + resultMap);
    return resultMap;
  }
}

3.4.2 HubOpenFeignClient接口

包名全路径:com.hub.example.feign。

接口名称:HubOpenFeignClient。

注解:@FeignClient,是Spring Cloud OpenFeign注解,配置OpenFeign客户端信息。其中,value的值是OpenFeign客户端需要调用的服务端的微服务名称,微服名称是注册到Nacos中的名称。

注解@ResponseBody、@RequestBody、@PostMapping是Spring Web的注解。

package com.hub.example.feign;
import com.hub.example.domain.CityBO;
import com.hub.example.domain.ResultMap;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.ResponseBody;
@FeignClient(contextId = "hubOpenFeignClient",
    value = "example-201-nacos")
public interface HubOpenFeignClient {
  @ResponseBody
  @PostMapping("/center/hub/getInfo")
  ResultMap getInfo(@RequestBody CityBO cityBO);
}

3.5配置类

无。

3.6配置文件

在\src\main\resources\目录下添加bootstrap.yml和application.yml。

微服务启动时,优先加载bootstrap.yml文件,并从Nacos服务器中加载配置到本地。

3.6.1 bootstrap.yml

bootstrap.yml内容如下:

server:
  port: 19091
  servlet:
    context-path: /feign
spring:
  application:
    # 微服务名称,从pom文件的artifactId标签取值
    name: @artifactId@
  cloud:
    nacos:
      # 服务发现,微服务名称,主机IP和端口,命名空间ID
      discovery:
        service: ${spring.application.name}
        server-addr: localhost:8848
        namespace: e8556e14-61e4-482b-b979-2230e00d1442
      # 服务配置,主机IP和端口,命名空间ID,文件后缀,配置信息(数据ID,刷新方式,分组名称)
      config:
        server-addr: localhost:8848
        namespace: e8556e14-61e4-482b-b979-2230e00d1442
        file-extension: yaml
        shared-configs:
          - data-id: config-hub.yaml
            refresh: true
            group: DEFAULT_GROUP
  1. 4.实体包example-200-entity
  2. 微服务使用的实体对象均集中放在example-200-entity模块中,每个微服务只需在pom.xml中引用此模块依赖即可。
  3. 4.1引用实体包
  4. 引用实体包。
<dependency>
  <groupId>com.hub</groupId>
  <artifactId>example-200-entity</artifactId>
  <version>${hub.example.version}</version>
</dependency>

4.2实体类

本例使用实体包括CityVO、CityBO、ResultMap。

4.2.1 CityVO类

CityVO,使用在对http请求入参的JSON格式数据封装。

import lombok.Data;
@Data
public class CityVO {
  private String cityName;
  private String cityNo;
}

4.2.2 CityBO类

CityBO,使用在对http请求入参的JSON格式数据封装。

import lombok.Data;
@Data
public class CityBO {
  private String cityName;
  private String cityNo;
}

4.2.3 ResultMap类

ResultMap使用在对http请求结果包装。可以便利的转换为JSON数据。

public class ResultMap extends HashMap<String, Object> {
  public ResultMap() {
    put("code", 0);
    put("message", "success");
  }
  public static ResultMap error(int code, String msg) {
    ResultMap resultMap = new ResultMap();
    resultMap.put("code", code);
    resultMap.put("msg", msg);
    return resultMap;
  }
}

Nacos应用

1.验证服务注册

验证微服务注册,使用微服务example-201-nacos即可。

1.1启动Nacos

本例Nacos版本是2.1.0,在windows环境验证。

启动命令:startup.cmd -m standalone

1.2登录Nacos的Dashboard

在浏览器登录Nacos的Dashboard,从左侧导航栏进入菜单:服务管理/服务列表。可以看到注册服务为空。

1.3启动example-201-nacos微服务实例1

使用IntelliJ IDEA 2021.2.3启动example-201-nacos微服务,刷新Nacos的页面。与1.2比较,可以看出微服务有一个实例已经注册成功。

微服务名称:example-201-nacos。

微服务端口:18080。

1.4启动example-201-nacos微服务实例2

把example-201-nacos打包成一个可执行的jar包。启动example-201-nacos微服务,刷新Nacos的页面,可以看到已经有两个实例注册成功。

微服务名称:example-201-nacos。

微服务端口:18081。

1.5查看服务详情

在菜单:服务管理/服务列表页面,点击详情按钮,可以查看微服务下节点信息。

2.验证服务配置

验证微服务注册,使用微服务example-201-nacos即可。

2.1启动Nacos

本例Nacos版本是2.1.0,在windows环境验证。

启动命令:startup.cmd -m standalone

2.2登录Nacos的Dashboard

在浏览器登录Nacos的Dashboard,从左侧导航栏进入菜单:配置管理/配置列表。可以看到配置信息。本例已经新建了config-hub.yaml配置。

2.3查看配置详细信息

点击详情,可以查看配置详细信息。

 2.4启动example-201-nacos微服务实例1

使用IntelliJ IDEA 2021.2.3启动example-201-nacos微服务,刷新Nacos的页面。确认微服注册成功。

微服务名称:example-201-nacos

微服务端口:18080

2.5发起http请求获取配置信息

本例使用Postman工具发起http请求,该请求是一个Get请求,在微服务中已经实现。接收到返回结果。

2.6修改配置信息并发布

在Nacos修改配置信息并发布。把配置1改成配置2。发布成功后,可以看到Tomcat日志已经表名实时更新了最新发布的配置。

配置1:

hub:
  msg: This is from Nacos config.

配置2:

hub:
  msg: This is from Nacos config01.

2.7发起http请求获取配置信息

再次发起http请求获取配置信息。

3.验证服务调用(RestTemplate)

使用RestTemplate作为微服务客户端。

全路径:org.springframework.web.client.RestTemplate。

3.1启动Nacos

启动命令:startup.cmd -m standalone

3.2登录Nacos

登录Nacos的Dashboard,在服务管理/服务列表查看服务注册情况。

3.3启动微服务

(1)启动微服务example-201-nacos,此微服务启动两个实例。比如使用IntelliJ IDEA启动一个实例,再打包一个可执行jar包启动一个实例。实例1:端口18080;实例2:端口18081。

(2)启动微服务example-201-client-rest,此微服务启动1个实例。实例:端口19090。

3.4使用Postman工具发请求

(1)请求URL

http://127.0.0.1:19090/rest/restHub/getInfo

(2)请求入参

{"cityName":"杭州","cityNo":"310000"}

(3)请求返回值:

{
  "cityNo": "310000",
  "code": 0,
  "cityName": "杭州",
  "randomUUID": "9b3237fc-45c8-4107-ae52-e7090c85ee1a",
  "message": "success"
}

3.5请求链路解析

(1)使用Postman发起请求,调用微服务example-201-client-rest。

(2)微服务example-201-client-rest,使用RestTemplate客户端调用example-201-nacos微服务。

(3)微服务example-201-nacos在Nacos注册了2个实例。每次请求到来后,RestTemplate的根据服务名称去调用两个实例中的一个。

(4)微服务example-201-nacos接收到请求的实例,处理请求并返回结果给微服务example-201-client-rest。

(5)微服务example-201-client-rest,把结果返回给Postman。

4.验证服务调用(OpenFeign)

使用Spring Cloud OpenFeign作为微服务客户端。

使用RestTemplate作为微服务客户端。

4.1启动Nacos

启动命令:startup.cmd -m standalone

4.2登录Nacos

登录Nacos,在服务管理/服务列表查看服务注册情况。

4.3启动微服务

(1)启动微服务example-201-nacos,此微服务启动两个实例。比如使用IntelliJ IDEA启动一个实例,再打包一个可执行jar包启动一个实例。实例1:端口18080;实例2:端口18081。

(2)启动微服务example-201-client-feign,此微服务启动1个实例。实例:端口19091。

4.4使用Postman工具发请求

(1)请求URL

http://127.0.0.1:19091/feign/feignHub/getInfo

(2)请求入参

{"cityName":"苏州","cityNo":"215000"}

(3)请求返回值:

{
  "cityNo": "215000",
  "code": 0,
  "cityName": "苏州",
  "randomUUID": "45f29635-d141-4581-892d-f9f23a221276",
  "message": "success"
}

4.5请求链路解析

(1)使用Postman发起请求,调用微服务example-201-client-feign。

(2)微服务example-201-client-feign,使用Spring Cloud OpenFeign客户端调用example-201-nacos微服务。

(3)微服务example-201-nacos在Nacos注册了2个实例。每次请求到来后,OpenFeign根据服务名称去调用两个实例中的一个。

(4)微服务example-201-nacos接收到请求的实例,处理请求并返回结果给微服务example-201-client-feign。

(5)微服务example-201-client-feign,把结果返回给Postman。

以上,感谢。

2022年9月26日

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值