【Spring Cloud Alibaba】
1. Spring Cloud Alibaba
Spring Cloud Alibaba 致力于提供微服务开发的一站式解决方案。此项目包含开发分布式应用微服务的必需组件,方便开发者通过 Spring Cloud 编程模型轻松使用这些组件来开发分布式应用服务。
依托 Spring Cloud Alibaba,您只需要添加一些注解和少量配置,就可以将 Spring Cloud 应用接入阿里微服务解决方案,通过阿里中间件来迅速搭建分布式应用系统。
2.Nacos注册中心
官网:https://nacos.io/zh-cn/
Nacos 致力于发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
2.1核心概念
1. 服务 (Service)
服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service.
2. 服务注册中心 (Service Registry)
服务注册中心,它是服务实例及元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务和路由器的客户端查询服务注册表以查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。
3. 服务元数据 (Service Metadata)
服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据
4. 服务提供方 (Service Provider)
是指提供可复用和可调用服务的应用方
5. 服务消费方 (Service Consumer)
是指会发起对某个服务调用的应用方
6. 配置 (Configuration)—配置文件中心
在系统开发过程中通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成这个步骤。配置变更是调整系统运行时的行为的有效手段之一。
7. 配置管理 (Configuration Management)
在数据中心中,系统中所有配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动统称为配置管理。
8. 名字服务 (Naming Service)
提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务,例如 ServiceName -> Endpoints Info, DNS Domain Name -> IP List, 服务发现和 DNS 就是名字服务的2大场景。
9. 配置服务 (Configuration Service)
在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者。
2.2 nacosServer的安装和启动
NacosServer相当于EurekaServer,只不过eurekaServer使我们自己搭建的一个项目,而NacosServer别人已经提供好了
1. NacosServer的下载
我们要对应版本,目前alibaba稳定版是2021.0.1.0对应的nacos版本为1.4.2
地址: https://github.com/alibaba/nacos/releases/tag/1.4.2
2.目录信息
bin:可执行文件夹目录,包含:启动、停止命令等等
conf:配置文件目录
target:存放naocs-server.jar
LICENSE:授权信息,Nacos使用 Apache License Version 2.0授权
NOTICE:公告信息
3.修改配置文件
进入${Nacos}/conf目录里面,使用文件编辑器打开application.properties文件
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?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC
db.user.0=root
db.password.0=123456
Nacos 默认使用嵌入式数据库实现数据的存储,并不方便观察数据存储的基本情况,这里面我们修改为使用Mysql数据库做数据的存储,方便我们观察数据的结构。原本的配置都是注释的,取消注释。
注意:上面的url地址是实际的服务器地址,用户名和密码都是实际的mysql数据库密码
4. Mysql表的导入
在config目录下找到对应的sql脚本-nacos-mysql,创建数据库nacos,运行sql脚本
提示:Nacos 建议使用5.7的Mysql 数据库,版本较低或者较高可能存储兼容性问题。
5.修改启动模式
进入到${Nacos}/bin 目录里面:打开startup.cmd文件,修改启动模式
将set MODE=”cluster”修改为standalone
set mode="standalone" #默认为cluster
6.启动服务器
执行startup.cmd,出现启动画面
http://localhost:8848/nacos ,即可访问启动Nacos 实例,默认用户名密码都是nacos
2.3搭建项目
分别搭建consumer 和provider两个项目,作为提供者和消费者。
1.创建项目
<properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.6.8</spring-boot.version>
<spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
</dependencies>
</dependencyManagement>
2.配置 application.yml
注意提供者端口为8001,则消费者端口设置为8002
server:
port: 8001
spring:
application:
name: consumer
cloud:
nacos: # 客户端注册的地址
server-addr: localhost:8848
username: nacos
password: nacos
# discovery: # 命名空间 可以做项目隔离
# namespace: car-namespace
# group: dev # 在命名空间下的组别,可以用来做细粒度的隔离
3.开启注册发现
@SpringBootApplication
@EnableDiscoveryClient //开启服务发现客户端 也就是nacosServer的客户端
public class AlibabaNacosConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(AlibabaNacosConsumerApplication.class, args);
}
}
4.提供者添加ProviderController
@RestController
public class ProviderController {
@GetMapping("hello")
public String hello(String name) {
return "hello:"+name;
}
}
启动查看nacos中的服务列表,是否正常注册。
5.消费者添加ConsumerController
@RestController
public class ConsumerController {
@Autowired
private DiscoveryClient discoveryClient;
@GetMapping("/discovery")
public String consumer()
{
List<ServiceInstance> list= discoveryClient.getInstances("provider");
ServiceInstance instance=list.get(0);
String result="服务:"+instance.getInstanceId()+",主机:"+instance.getHost()+",服务URL:" + instance.getUri()+",端口"+instance.getPort();
return result;
}
}
至此,服务注册和服务发现已经完成了,基本和eureka一样,注意,只能发现在同一个命名空间下和同一个组别下面才可以发现.
6.集成openfeign做远程调用和负载均衡
修改consumer的内容,添加open-feign组件,注意springcloud的版本
<properties>
<spring-boot.version>2.6.8</spring-boot.version>
<spring-cloud.version>2021.0.1</spring-cloud.version>
<spring-cloud-alibaba.version>2021.0.1.0</spring-cloud-alibaba.version>
</properties>
<dependencies>
<!--open组件-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<!-- 因为nacos没有集成lb 所以得添加这个依赖 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<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>
</dependencies>
</dependencyManagement>
7.修改启动类,添加注解
@EnableFeignClients //开启feign的客户端
8.添加Hello的Feign接口
@FeignClient(value = "provider")
public interface ProviderFeign {
@GetMapping("hello")
String hello(@RequestParam("name") String name);
}
9.添加多一个提供者项目provider2
测试负载均衡和feign远程调用的结果
2.4 Nacos Discovery对外暴露Endpoint
Nacos Discovery 内部提供了一个 Endpoint, 对应的 endpoint id 为 nacos-discovery。我们通过该Endpoint,能获取到:
当前服务有哪些服务订阅者 ;
当前应用 Nacos 的基础配置信息 ;
1. 给任意项目添加依赖
假设我们想看消费者的一些信息,我们给消费者添加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
2 修改配置文件
Endpoint本身对外界隐藏显示,我们需要在配置里面开启对Endponit的显示支持。
修改application.yml配置文件,在里面添加如下的配置:
management:
endpoints:
web:
exposure:
include: '*'
说明:
exposure.include:对外界保留那些Endpoint,若是所有则使用* ;
3. 启动项目访问查看效果
http://localhost:8001/actuator
http://localhost:8001/actuator/nacosdiscovery
2.5 Nacos Discovery Starter更多的配置项
配置项 | 默认值 | Key | 配置说明 |
---|---|---|---|
服务端地址 | 无 | spring.cloud.nacos.discovery.server-addr | Nacos Server 启动监听的ip地址和端口 |
服务名 | ${spring.application.name} | spring.cloud.nacos.discovery.service | 给当前的服务命名 |
服务分组 | DEFAULT_GROUP | spring.cloud.nacos.discovery.group | 设置服务所处的分组 |
权重 | 1 | spring.cloud.nacos.discovery.weight | 取值范围 1 到 100,数值越大,权重越大 |
网卡名 | 无 | spring.cloud.nacos.discovery.network-interface | 当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址 |
注册的IP地址 | 无 | spring.cloud.nacos.discovery.ip | 优先级最高 |
注册的端口 | -1 | spring.cloud.nacos.discovery.port | 默认情况下不用配置,会自动探测 |
命名空间 | 无 | spring.cloud.nacos.discovery.namespace | 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。 |
AccessKey | 无 | spring.cloud.nacos.discovery.access-key | 当要上阿里云时,阿里云上面的一个云账号名 |
SecretKey | 无 | spring.cloud.nacos.discovery.secret-key | 当要上阿里云时,阿里云上面的一个云账号密码 |
Metadata | 无 | spring.cloud.nacos.discovery.metadata | 使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息 |
日志文件名 | 无 | spring.cloud.nacos.discovery.log-name | |
集群 | DEFAULT | spring.cloud.nacos.discovery.cluster-name | 配置成Nacos集群名称 |
接入点 | UTF-8 | spring.cloud.nacos.discovery.enpoint | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 |
是否集成Ribbon | true | ribbon.nacos.enabled | 一般都设置成true即可 |
是否开启Nacos Watch | true | spring.cloud.nacos.discovery.watch.enabled | 可以设置成false来关闭 watch |
os.discovery.enpoint | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 |
| 是否集成Ribbon | true | ribbon.nacos.enabled | 一般都设置成true即可 |
| 是否开启Nacos Watch | true | spring.cloud.nacos.discovery.watch.enabled | 可以设置成false来关闭 watch |
.00.