学技术、更要掌握学习的方法,一起学习,让进步发生
作者:一只IT攻城狮 ,关注我,不迷路 。
学习建议:1、养成习惯,学习java的任何一个技术,都可以先去官网先看看,更准确、更专业。
学习建议:2、然后记住每个技术最关键的特性(通常一句话或者几个字),从主线入手,由浅入深学习。
❤️ 《SpringCloud入门实战系列》解锁SpringCloud主流组件入门应用及关键特性。带你了解SpringCloud主流组件,是如何一战解决微服务诸多难题的。
❤️Nacos简介、安装、运行参看: SpringCloud入门实战(十三)Nacos服务注册与发现+配置管理详解
❤️Nacos(服务注册与发现)项目集成: Nacos(服务注册与发现)+SpringBoot+openFeign项目集成
SpringCloud是分布式微服务架构的一站式解决方案,是多种微服务架构落地技术的集合体。而SpringCloud Alibaba是SpringCloud中一个重要项目,Nacos作为SpringCloud Alibaba项目中的一项重要组件,我们需要重点去了解和学习。
我们知道使用 Nacos 是简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。Nacos = Eureka + Config + bus可以替代Eureka做服务注册中心,可以替代Config做服务配置中心。
那我们结合项目具体来学习一下优秀的Nacos作为注册中心是如何使用的。
可以先准备好nacos环境:进入的nacos的bin目录,启动服务器 :
sh startup.sh -m standalone
访问http://localhost:8848/nacos看到界面即成功启动。接下来搭建项目。
新建父工程cloud-nacos。
1)父pom中引入spring-cloud-alibaba-dependencies
依赖,注意SpringBoot、SpringCloud、Spring Cloud Alibaba及组件间版本问题。可参看SpringBoot、SpringCloud、Spring Cloud Alibaba版本对照表(详细准确)。我的版本如下:
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>2021.0.4</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2021.0.4.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.7.1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
提示:搭建好项目,如果后续启动测试时也会报错:
Could not initialize class com.alibaba.nacos.common.remote.client.grpc.GrpcSdkClient
那也是因为引用的spring cloud 版本,alibaba cloud版本,nacos的版本不一致导致的。
2)新建子module,cloud-payment工程作为服务提供者,pom引入spring-cloud-starter-alibaba-nacos-discovery
依赖:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-loadbalancerartifactId>
dependency>
提示:由于Netflix Ribbon 进入停更维护阶段,因此SpringCloud 2020.0.1 版本之后,删除了eureka中的ribbon, 替代ribbon的是spring cloud自带的LoadBalancer,默认使用的是轮询的方式,新版本的 Nacos discovery 都已经移除了 Ribbon ,因此我们
使用Nacos时也需要引入loadbalancer
才能调起服务。
cloud:
nacos:
discovery:
# 配置 nacos 的服务地址
server-addr: localhost:8848
management:
endpoints:
web:
exposure:
include: '*'
启动类增加注解:@EnableDiscoveryClient
编写简单的查询业务类,并启动服务,可以看到nacos上实例数变成2
新建module:cloud-order。这里我引入了spring-cloud-starter-openfeign
通过openfeign代替Ribbon+RestTemplate
方式调用服务提供者。
提示:openfeign知识传送门:SpringCloud入门实战(六)-OpenFeign服务调用
附上完整pom:
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springcloud-nacosartifactId>
<groupId>org.testgroupId>
<version>1.0-SNAPSHOTversion>
parent>
<modelVersion>4.0.0modelVersion>
<artifactId>cloud-orderartifactId>
<dependencies>
<dependency>
<groupId>org.testgroupId>
<artifactId>cloud-commonartifactId>
<version>1.0-SNAPSHOTversion>
dependency>
<dependency>
<groupId>javax.servletgroupId>
<artifactId>javax.servlet-apiartifactId>
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>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-actuatorartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-openfeignartifactId>
<version>3.1.3version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
dependency>
<dependency>
<groupId>log4jgroupId>
<artifactId>log4jartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-devtoolsartifactId>
<scope>runtimescope>
<optional>trueoptional>
dependency>
dependencies>
project>
server:
port: 80
spring:
application:
name: cloud-order #微服务应用的名字
cloud:
nacos:
discovery:
server-addr: localhost:8848
## 消费者将要去访问的微服务名称( 注册成功进 nacos 的微服务提供者)
service-url:
nacos-user-service: http://cloud-payment
启动类增加注解:@EnableDiscoveryClient
以及开启feign的调用@EnableFeignClients
/**
* @author qy
* @date 2022年07月13日 16:46
*/
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@EnableDiscoveryClient
@EnableFeignClients
public class CloudOrder {
public static void main(String[] args) {
SpringApplication.run(CloudOrder.class, args);
}
}
编写简单的查询业务类,并启动服务,可以看到nacos上实例数变成3
重点代码:
/**
*
* OrderController.java
*/
@RestController
@RequestMapping("/order")
@Slf4j
public class OrderController {
@Resource
private PaymentService paymentService;
@GetMapping(value = "/ok/{id}")
public String paymentInfoOk(@PathVariable("id") Integer id) {
String result = paymentService.paymentInfoOk(id);
log.info("========result:{}========", result);
return result;
}
@GetMapping(value = "/timeout/{id}")
public String paymentInfoTimeOut(@PathVariable("id") Integer id) {
String result = paymentService.paymentInfoTimeOut(id);
log.info("========result:{}========", result);
return result;
}
}
/**
*
* Feign接口类 PaymentService.java
*/
@Component
@FeignClient(value = "cloud-payment",fallback = PaymentFallbackService.class)
public interface PaymentService {
@GetMapping(value = "/payment/ok/{id}")
String paymentInfoOk(@PathVariable("id") Integer id);
@GetMapping(value = "/payment/timeout/{id}")
String paymentInfoTimeOut(@PathVariable("id") Integer id);
}
@Component
public class PaymentFallbackService implements PaymentService {
@Override
public String paymentInfoOk(Integer id) {
return "全局解耦降级处理PaymentFallback->paymentInfoOk!";
}
@Override
public String paymentInfoTimeOut(Integer id) {
return "全局解耦降级处理PaymentFallback->paymentInfoTimeOut!";
}
}
访问http://localhost/order/ok/1测试,多次调用,轮询访问。
如果你的应用测试报错:
Load balancer does not contain an instance for the service ..
,参看:解决办法。
Nacos作为服务注册与发现的项目实战就到这里了。下一节,我们再详细介绍Nacos服务配置中心、Nacos集群和持久化配置。