Spring Cloud Alibaba
关系如下:
SpringBoot–》SpringCloud–》SpringCloudAlibaba
Spring Cloud的又一套解决方案。在此之前常用Spring Cloud Netflix(部分组件已停止维护)。
github官网查看和SpringBoot、SpringCloud 之间的版本关系
对比Netflix:netflx很多组件需要自己搭建服务端。而alibab组件都是直接下载使用,客户端连接即可。且提供了直观的图形化界面。
整合:使用idea的Spring Initializr快速创建项目。
- 引入SpringBoot父依赖
- 引入SpringCloud依赖
- 引入SpringCloudAlibaba依赖
<!-- SpringBoot的父依赖-->
<parent> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0RELEASE</version>
<relativePath/>
</parent>
<!-- 版本控制,子项目不作为资源继承。需要引入但不需要版本号-->
<dependencyManagement>
<dependencies>
<!-- Spring Cloud Hoxton -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!-- Spring Cloud Alibaba -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.1.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
Nacos
nacos下载解压并启动。访问cmd窗口中的哪个牛逼的地址8848.nacos用户名密码默认。
链接:https://pan.baidu.com/s/12-2rT3Mafvcd-NWACQXcug
提取码:sjrb
Nacos-Discovery
服务注册/发现。服务治理
-
服务注册
-
启动Nacos Server
解压目录下的bin下的startup.cmd或者sh为linux
- 创建子模块并导入nacos-discovery相关依赖
<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>
- 配置nacos地址
server:
port: 8081
# 应用名称
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
启动类中使用 注解的 属性确定是否注册到nacos中
- 启动项目进行测试即可。
注意:Nacos配置了nacos地址后是默认注册进入注册中心的
- 服务发现
同上操作即可。
不同点:
在引导类中不让服务发现注册到nacos
@SpringBootApplication
@EnableDiscoveryClient(autoRegister = false)
public class NacosCousumerApplication {
public static void main(String[] args) {
SpringApplication.run(NacosCousumerApplication.class, args);
}
@Bean//注入RestTemplate模板用于发送请求
public RestTemplate restTemplate(){
return new RestTemplate();}
}
Controller中调用provider服务
@RestController
@RequestMapping("/consumer")
public class ConsumerController {
@Value("${spring.application.name}")
private String name;
@Value("${server.port}")
private String port;
@Autowired
private RestTemplate restTemplate;
@Autowired//用于发现服务实例。其中包含服务的具体信息。
private DiscoveryClient discoveryClient;
@GetMapping("/hello")
public String hello() {
return name+"::" +port;
}
@GetMapping("/hello1")
public String hello1() {
List<ServiceInstance> instances = discoveryClient.getInstances("nacos-provider");
for (ServiceInstance instance : instances) {
String url=instance.getUri() + "/provider/hello";
String forObject = restTemplate.getForObject(url, String.class);
System.out.println(forObject);
}
return name+"::" +port;
}
}
启动nacos、nacos-provider服务、consumer服务。访问localhost:8082/consumer/hello1即可。发现控制台打印了nacos-provider服务的响应数据。
至此基本的服务注册、发现、调用已实现。
Nacos-Config
Alibaba的配置管理中心。之前用Netflix的config,config则需要消息总线才可以实现动态刷新。Alibaba的配置中心可以直接实现动态刷新配置。如果是实现配置Bean的动态刷新则需要在创建Bean的方法和类上添加@RefreshScope实现动态刷新。
可以将mysql数据库连接信息放到nacos配置中心去。更安全
-1. 启动nacos。windows下执行nacos路径下的bin下的startup.cmd。linux为sh
- nacos中创建对应的配置文件。指定配置文件分组以及文件格式等信息。
- 创建配置测试模块并导入nacos-config相关依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>2.2.5.RELEASE</version>
</dependency>
- 创建bootstrap.yaml配置文件。配置nacos地址以及读取配置文件的相关信息。(bootstrap文件加载优先级高于application)
spring:
application:
name: configs
cloud:
nacos:
discovery:
server-addr: localhost:8848 # nacos地址
config:
prefix: myConfig # 指定配置文件名称
file-extension: yaml # 指定配置文件后缀格式
group: yh #指定配置文件的分组。如果为默认则不用指定指定会报错
server:
port: 8091
注意:当不配置文件名称以及文件后缀时候,默认为获取服务名称为名的properties配置文件。注意配置到application配置文件中会导致无法被加载的。
- 使用配置类绑定配置文件中的配置。
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String name;
private String address;
private int age;
//省略get、set等方法
}
- 添加Controller控制器类
//使用三种获取配置文件内容的方式分别读取不同的配置
@RestController
@RequestMapping("/config")
class ConfigController {
@Autowired
private Environment environment;
@Value("${anmail.name}")
private String name;
@Autowired
private Person person;
@GetMapping("/user")
public String user() {
String user = environment.getProperty("user");
return "User信息:" + user;
}
@GetMapping("/name")
public String name() {
return "Anmail信息:" + name;
}
@GetMapping("/person")
public String config() {
return "Person信息:" + person.getName()+"::"+person.getAge()+"::"+person.getAddress();
}
}
-
访问三个路径
至此基本的配置中心使用完结撒花。