实战Spring Cloud之Nacos替换Eureka
原创
©著作权归作者所有:来自51CTO博客作者zhuhuix的原创作品,请联系作者获取转载授权,否则将追究法律责任
文章目录
背景
- 在《实战Spring Cloud微服务治理组件Eureka》这篇文章中,我们运用了Spring Cloud Netflix 的Eureka组件,进行了微服务治理框架的搭建。
- 但不幸的是, Eureka 2.0 的开源工作已经停止,我们不得不寻找另外一个微服务注册及发现框架来替换Eureka.
一、Nacos
- 在2018年 6 月份 Aliware 技术行上海站 Dubbo 开发者沙龙上,阿里巴巴高级技术专家郭平 (坤宇) 宣布了阿里巴巴的一个新开源项目 Nacos。
Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:
- Kubernetes Serviceg
- RPC & Dubbo RPC Service
- Spring Cloud RESTful Service
二、安装Nacos
# 下载nacos最新版
wget https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3.2.tar.gz
# 解压文件
tar
# 通过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`),
...
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控制台
三、Nacos Discovery Client替换Eureka Client
<!-- 去除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;
}
}
- 运行微服务程序
- 查看Nacos服务中心
四、消费者程序通过Nacos实现服务调用
<!-- 去除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工具进行测试
小结
- Nacos与Spring Cloud的结合,可以完美取代Eureka做为微服务发现及注册的基础框架。
- 通过Nacos特性大图中,我们还可以了解到,Nacos除了服务发现的框架,还能做到配置管理,DNS服务等功能。