一、SpringCloud简介
SpringCloud 是微服务架构的集大成者,将一系列优秀的组件进行了整合。基于springboot构建。通过一些简单的注解,我们就可以快速的在应用中配置一下常用模块并构建庞大的分布式系统。
二、Spring Cloud Alibaba简介
SpringCloud Alibaba是Alibaba结合自身的微服务实践,在SpringCloud项目的基础上,开源的一套微服务全家桶。
SpringCloud = springboot+Netflix
SpringCloud Alibaba= springboot+alibaba
三、SpringCloud和Spring Cloud Alibaba的关系
•SpringCloud Alibaba是SpringCloud的子项目
•SpringCloud Alibaba是依赖SpringCloud相关的标准实现的一套微服务的全家桶。
四、系统架构的演变
说起springcloud不得不说系统架构的发展史
1、单体架构存在:代码耦合、迭代困难、扩展受限、技术债务的问题,无法做大项目
2、分布式架构存在:各系统存在重叠业务(重复开发)
3、SOA:抽取的粒度大、服务提供方和消费方耦合度太高
4、微服务:单一职责、面向服务、耦合度低
五、Nacos
1、简介
Naming 、Configuration 、service的简写:注册和配置服务
简单理解:nacos就是一个注册中心服务和配置中心服务
2、下载并安装nacos官方下载地址
https://github.com/alibaba/nacos/tags
解压安装包
1、解压
tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local
2、启动和关闭
非集群启动:
cd /usr/local/nacos/bin
./starup.sh -m standalone
出现下面代码,表示启动成功:
nacos is starting,you can check the /usr/java/nacos/logs/start.out
关闭:
cd /usr/local/nacos/bin
/shutdown.sh
Send shutdown request to nacosServer(3543) OK
关闭成功
3.启动成功后,可以访问Nacos的服务与配置中心
浏览器访问http://192.168.163.131:8848/nacos/。IP地址更换为你开启nacos的主机IP地址即可,账户名密码均为nacos,中文看不太明白,可以参看英文^_^
六、Nacos的简单入门小案例(注册中心)
1、Spring Boot和Spring Cloud的版本号说明
创建工程之前先选好版本,最好别自行搭配,按照官网指定的版本来创建项目。Spring Cloud是基于Springboot的对应版本号开发的,属于依赖的关系,所以不能都选用最新版本
2、创建父工程
pom.xml管理依赖
<properties>
<!-- 项目源码及编译输出的编码 -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- 项目编译JDK版本 -->
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
</properties>
<dependencyManagement>
<dependencies>
<!--Spring Boot-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Netflix-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR9</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud 阿里巴巴-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.6.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
3、创建子Module:nacos_provider
pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
application.yml
server:
port: 9090
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.163.131:8848 #nacos的服务地址
namespace: b0e76b38-d2a0-4507-ab74-f9ae8a5f0190 #读取开发环境的配置文件 namespace隔离 服务隔离
group: NACOS_GROUP #读取NACOS_GROUP这个分组下的配置文件,分组隔离 服务隔离
application:
name: nacos-provider #向注册中心注册的名字
NacosProviderApp启动类(这个注解@EnableDiscoveryClient开启发现服务,是关键)
@SpringBootApplication
@EnableDiscoveryClient//向注册中心注册服务,并可以获得其他服务的地址
public class NacosProviderApp {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApp.class, args);
}
}
创建一个简单的service,和controller,暴露地址
4、创建子Module:nacos_consumer
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos客户端-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
application.yml
server:
port: 80
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.163.131:8848 #nacos的服务地址
namespace: b0e76b38-d2a0-4507-ab74-f9ae8a5f0190 #可自定义,读取开发环境的配置文件 namespace隔离 服务隔离
group: NACOS_GROUP #读取NACOS_GROUP这个分组下的配置文件,分组隔离 服务隔离
application:
name: nacos-consumer #向注册中心注册的名字
NacosConsumerApp启动类(同上)
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApp {
public static void main(String[] args) {
SpringApplication.run(NacosConsumerApp.class, args);
}
}
创建ConsumerController类
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
//调用rest服务的客户端
@Autowired
private RestTemplate restTemplate;
@Autowired
private DiscoveryClient discoveryClient;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
//调用服务
/*String url = "http://127.0.0.1:9090/provider/getUserById/" + id;
return restTemplate.getForObject(url, User.class);*/
//获取nacos注册中心的所有服务信息
List<String> services = discoveryClient.getServices();
for (String service : services) {
System.out.println(service+"所有服务");
}
//获取nacos中注册的指定服务名为nacos-provider的服务信息
// ServiceInstance instance = discoveryClient.getInstances("nacos-provider").get(0);
List<ServiceInstance> instances = discoveryClient.getInstances("nacos-provider");
for (ServiceInstance instance : instances) {
System.out.println("nacos-provider的服务信息:"+instance);
}
ServiceInstance instance = instances.get(0);
//getHost主机名+端口号
String serviceUrl = instance.getHost() + ":" + instance.getPort();
System.out.println("url"+instance.getHost() + ":" + instance.getPort());
//拼接地址
String url = "http://"+serviceUrl+"/provider/getUserById/"+id;
return restTemplate.getForObject(url, User.class);
}
}
利用RestTemplate工具类模仿地址调用,在这个工程的controller中调用,并暴露出接口
发布服务后
nacos页面会出现你的服务,也说明注册成功了
5、使用注册中心可以动态的得到注册到服务中心的信息,通过服务名可以取出。
六、Nacos的简单入门小案例(配置中心)
1、创建子Module:nacos_config
1.pom.xml
<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-config</artifactId>
</dependency>
</dependencies>
2.bootstrap.yml
注意:
客户端配置文件的名称必须为
bootstrap.yml
bootstrap/ application 的应用场景:
bootstrap.yml
比applicaton.yml
优先加载,应用于系统级别参数配置,一般不会变动;application.yml
应用于SpringBoot项目的自动化配置;
spring:
cloud:
nacos:
config:
server-addr: 192.168.163.131:8848
file-extension: yaml #后缀名,和配置中心的配置文件一样
prefix: nacos-config #文件名,如果没有配置则默认为和配置中心的 ${spring.application.name}一样
namespace: dev #读取开发环境的配置文件 namespace隔离
group: NACOS_GROUP #读取NACOS_GROUP这个分组下的配置文件,分组隔离
3.NacosConfigApp启动类
@SpringBootApplication
@EnableDiscoveryClient
public class NacosConfigApp {
public static void main(String[] args) {
SpringApplication.run(NacosConfigApp.class, args);
}
}
4.ConfigController
@RestController
@RefreshScope //重新从BeanFactory获取一个新的实例(该实例使用新的配置)
public class ConfigController {
@Value("${spring.datasource.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.url}")
private String url;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.type}")
private String type;
@GetMapping("/config/info")
public String getConfigInfo(){
System.out.println(this+"++");
String configInfo = driverClassName+"<br>"+url+"<br>"+username+"<br>"
+password+"<br>"+type;
return configInfo;
}
}
5.在nacos中创建配置文件
Data ID:和配置文件指定的文件名.后缀名:prefix.file-extension
配置格式:yaml或properties
配置内容
server:
port: 87
spring:
cloud:
nacos:
discovery:
server-addr: 192.168.163.131:8848
application:
name: nacos-config
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/health?characterEncoding=UTF-8
username: root
password: 1111
type: com.alibaba.druid.pool.DruidDataSource
最后发布,启动nacos_config类
访问地址可以得到配置信息
使用配置中心的好处:
①集中管理配置文件
②动态更新配置文件
七、隔离
1、配置隔离和服务隔离
对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。
Namespace Group DataId介绍:
Namespace: 代表不同的环境的配置隔离, 如: 开发、测试, 生产等
Group: 可以代表某个项目, 如XX医疗项目, XX电商项目
DataId: 每个项目下往往有若干个工程, 每个配置集(DataId)是一个工程的主配置文件
- namespace -------------------------- 环境:dev、test、prod
- group -------------------------- 项目名:health、jd
- Data ID -------------------------- 工程名:nacos-config.yaml health-provider.yaml
之前的配置文件已经完成了配置隔离和服务隔离,需要nacos网页配置对应的namespace