文章目录

背景

  • 在《实战Spring Cloud微服务治理组件Eureka》这篇文章中,我们运用了Spring Cloud Netflix 的Eureka组件,进行了微服务治理框架的搭建。
  • 但不幸的是, Eureka 2.0 的开源工作已经停止,我们不得不寻找另外一个微服务注册及发现框架来替换Eureka.
  • 实战Spring Cloud之Nacos替换Eureka_Spring Cloud

一、Nacos

  • 在2018年 6 月份 Aliware 技术行上海站 Dubbo 开发者沙龙上,阿里巴巴高级技术专家郭平 (坤宇) 宣布了阿里巴巴的一个新开源项目 Nacos。

Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:

  1. Kubernetes Serviceg
  2. RPC & Dubbo RPC Service
  3. Spring Cloud RESTful Service

二、安装Nacos

  • 获取Nacos安装文件并进行解压
# 下载nacos最新版
wget https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3.2.tar.gz
# 解压文件
tar
  • 建立Nacos配置数据库
# 通过nacos-mysql.sql脚本建立数据库
cd nacos/conf
vim nacos-mysql.sql

/******************************************/
/* 数据库全名 = nacos_config */
/* 表名称 = config_info */
/******************************************/
CREATE TABLE `config_info` (
`id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'id',
`data_id` varchar(255) NOT NULL COMMENT 'data_id',
`group_id` varchar(255) DEFAULT NULL,
`content` longtext NOT NULL COMMENT 'content',
`md5` varchar(32) DEFAULT NULL COMMENT 'md5',
`gmt_create` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '修改时间',
`src_user` text COMMENT 'source user',
`src_ip` varchar(20) DEFAULT NULL COMMENT 'source ip',
`app_name` varchar(128) DEFAULT NULL,
`tenant_id` varchar(128) DEFAULT '' COMMENT '租户字段',
`c_desc` varchar(256) DEFAULT NULL,
`c_use` varchar(64) DEFAULT NULL,
`effect` varchar(64) DEFAULT NULL,
`type` varchar(64) DEFAULT NULL,
`c_schema` text,
PRIMARY KEY (`id`),
...

实战Spring Cloud之Nacos替换Eureka_微服务_03

  • 修改配置文件
cd nacos/conf
# 编辑配置文件
vim application.properties

#*************** Spring Boot Related Configurations ***************#
### Default web context path:
server.servlet.contextPath=/nacos
### Default web server port:
server.port=8848

#*************** Network Related Configurations ***************#
### If prefer hostname over ip for Nacos server addresses in cluster.conf:
# nacos.inetutils.prefer-hostname-over-ip=false

### Specify local server's IP:
# nacos.inetutils.ip-address=


#*************** Config Module Related Configurations ***************#
### If use MySQL as datasource:
spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user=root
db.password=root
  • 运行nacos
cd
  • 登录nacos控制台
  • 实战Spring Cloud之Nacos替换Eureka_微服务_04

三、Nacos Discovery Client替换Eureka Client

  • 打开pom.xml,替换依赖
<!-- 去除eureka clinet客户端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
-->
<!-- 加入Nacos Discovery Client 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 重新设置项目配置文件:application.properties
# 服务名称
spring.application.name=goods-service
# nacos 服务注册地址
spring.cloud.nacos.discovery.server-addr=172.33.62.249:8848
  • 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能
// 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能
@EnableDiscoveryClient
@SpringBootApplication
public class DemoServiceApplication {

public static void main(String[] args) {

SpringApplication.run(DemoServiceApplication.class, args);
}

}
  • 原有服务程序不需要任何变化
/**
* 商品服务-模拟返回商品列表
*/
@RestController
@RequestMapping("api/goods")
public class GoodsService {
public static final Logger logger = LoggerFactory.getLogger(GoodsService.class);
// 返回商品列表
@GetMapping
public List<Goods> getAllGoods(HttpServletRequest httpServletRequest) {
List<Goods> goods = new ArrayList<>();
goods.add(new Goods("电脑", 10));
goods.add(new Goods("手机", 20));
goods.add(new Goods("书籍", 30));
logger.info("服务被调用:"+httpServletRequest.getRequestURI());
return goods;
}

}
  • 运行微服务程序
  • 实战Spring Cloud之Nacos替换Eureka_spring_05

  • 查看Nacos服务中心
  • 实战Spring Cloud之Nacos替换Eureka_spring_06

四、消费者程序通过Nacos实现服务调用

  • 打开pom.xml,替换依赖
<!-- 去除eureka clinet客户端
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
-->
<!-- 加入Nacos Discovery Client 依赖 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
  • 重新设置项目配置文件:application.properties
server.port=8081
spring.application.name=user-consumer
# nacos 服务发现地址
spring.cloud.nacos.discovery.server-addr=172.33.62.249:8848
# 商品微服务地址
service.url=http://goods-service/
  • 通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务发现功能,并向Spring注册一个RestTemplate Bean
@EnableDiscoveryClient
@SpringBootApplication
public class DemoConsumerApplication {

// 向Spring注册一个RestTemplate Bean
@Bean
// 负载均衡
@LoadBalanced
RestTemplate restTemplate(){
return new RestTemplate();
}

public static void main(String[] args) {
SpringApplication.run(DemoConsumerApplication.class, args);
}
}
  • 创建Restful测试接口,在接口中调用Nacos服务中心的商品微服务
/**
* 用户消费者--调用nacos服务中心的商品服务,并对外提供RestFul接口测试
*/
@RestController
@RequestMapping("user/")
public class UserConsumer {

@Autowired
private RestTemplate restTemplate;

@Value("${service.url}")
private String url;

@GetMapping("/goods")
public User getUserGoods() {
User user = new User();
// 调用商品微服务
Object response = restTemplate.getForEntity(url + "api/goods", Object.class).getBody();
try {
user.setName("jack");
user.setGoods((List<GoodsDTO>) response);
} catch (Exception e){
throw new RuntimeException(e.getMessage());
}
return user;
}

}
  • 运行消费端,并打开HttpClient工具进行测试
  • 实战Spring Cloud之Nacos替换Eureka_spring_07

实战Spring Cloud之Nacos替换Eureka_spring_08


实战Spring Cloud之Nacos替换Eureka_Nacos_09

小结

  • Nacos与Spring Cloud的结合,可以完美取代Eureka做为微服务发现及注册的基础框架。
  • 通过Nacos特性大图中,我们还可以了解到,Nacos除了服务发现的框架,还能做到配置管理,DNS服务等功能。
  • 实战Spring Cloud之Nacos替换Eureka_微服务_10