Spring cloud是微服务架构的一个框架,为服务架构强调服务的“彻底拆分”,目的就是提高效率,微服务架构中,每个服务必须独立部署同时互不影响,微服务架构更加轻巧,轻量级。
Nacos=注册中心+配置中心
稳定版2.0.3,[Nacos下载地址](https://github.com/alibaba/nacos/releases)
下载对应的zip文件
解压到常用的文件夹
进入到文件夹bin目录
cd /Users/<你的文件夹名>/nacos/bin
启动Nacos
sh startup.sh -m standalone
-m standalone代表单机模式
启动成功后如下图所示
访问:http://localhost:8848/nacos
默认的账号密码是:nacos/nacos
创建一个父子项目
File–> new–>Project–>Spring Initializr–>next–>选择合适groupId和项目名,类型选择Maven Project–>Finish
按照官网的提示进行设置
spring cloud nacos官方使用说明文档
设置pom文件
再创建子项目,在父项目和子项目的pom文件中设置好依赖关系,其中子项目需要添加:
关于springcloud和springboot版本的对应关系,如下:
spring cloud和spring boot版本对应关系
<parent>
<groupId>com.cloudgroupId>
<artifactId>apolloartifactId>
<version>0.0.1-SNAPSHOTversion>
<relativePath/>
parent>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
dependencies>
父项目需要添加
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-alibaba-dependenciesartifactId>
<version>2.2.5.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
<modules>
<module>springnacos-9001module>
modules>
设置yml文件
子项目在/main/resources/中添加application.yml,内容如下:
server:
port:
9001
spring:
application:
name: nacos-provider
cloud:
discovery:
server-addr: 127.0.0.1:8848
management:
endpoints:
web:
exposure:
include: '*'
以上添加的内容在官方说明文档都有写哦
启动类添加注解
package com.cloud.springnacos9001;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
// 这个注解说明该服务在运行时会被nacos自动发现服务
public class Springnacos9001Application {
public static void main(String[] args) {
SpringApplication.run(Springnacos9001Application.class, args);
}
}
运行成功后,会在Nacos中“服务列表”目录中看到你的服务,说明这个应用在启动时就被nacos监测到
首先,准备两个spring.application.name为nacos-provider的服务提供者子模块,再准备一个spring.application.name为nacos-consumer的服务消费者,其中服务消费者准备流程如下:
在启动类中装配restTemplate
package com.cloud.springcloudcosumer8083;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class SpringcloudCosumer8083Application {
public static void main(String[] args) {
SpringApplication.run(SpringcloudCosumer8083Application.class, args);
}
@Bean
// @Bean注解表示将restTemplate装配到容器中来
@LoadBalanced
// 负载均衡,表示这个restTemplate在调用服务提供者接口时经过负载均衡
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
消费者Controller
package com.cloud.springcloudcosumer8083.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("consumer")
public class DemoController {
@Autowired
private RestTemplate restTemplate;
@Value("${service-url.nacos-user-service}")
private String serviceUrl;
@GetMapping("visit")
public String visitProvider(){
/**
* getForObject(String url,Object.class,Map/Object... params)
* 1.url表示这个方法即将访问的路径
* 2.Object.calss表示调用结果的类型,如果结果是一个List,只能用Array作为其返回数据类型
* 3.可以是一个Map类型,或多个Object,表示参数,使用时需要给url加上{1},{2},{3}表示占位
*/
String result = restTemplate.getForObject(serviceUrl+"/demo/get",String.class);
return result;
}
}
访问消费者接口的时候,会出现负载均衡效果。
注意版本!2021.0.1.0版本的nacos不包含ribbon了,使用了别的负载均衡组件,注意自己去看官网!
新建一个子项目,使用Nacos配置中心,建立好主子模块的pom关系,然后添加以下依赖
添加支持配置的依赖:
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
添加配置文件bootstrap.yml
# 端口配置
server:
port: 3377
# 服务名称
spring:
application:
name: nacos-config-client
cloud:
nacos:
discovery:
server-addr: localhost:8848 # Nacos服务中心注册地址
config:
server-addr: localhost:8848 # Nacos作为配置中心的地址
file-extension: yaml # 制定yaml格式的配置文件
添加环境配置文件application.yml:
spring:
profiles:
active: dev # 表示开发环境
启动类添加注解@EnableDiscoveryClient
业务类代码:
package com.cloud.cloudalibabaconfig3377.controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
/**
* 实现配置自动更新,不需要重新启动项目
*/
@RefreshScope
@RequestMapping("config")
public class ConfigClientController {
/**
* 此处并没有在application.yml等任何配置中设置这个值,而是通过Nacos配置中心去设置它
*/
@Value("${config.info}")
private String configInfo;
@GetMapping("info")
public String getConfig(){
return configInfo;
}
}
启动Nacos,浏览器打开localhost:8848/nacos,添加配置文件
其中,配置文件的格式规则如下:详见官网
这个dataId一定不能写错,一旦写错,Nacos无法读取配置文件,项目会启动报错。
注意
点击发布后,配置文件生效,注意yaml格式不能写错,不能使用中文冒号。
可以编辑此配置文件,此时即使不重启项目,设置了读取配置的服务也会自动根据配置的更新而更新。
测试,多次修改config.info的内容,会发现访问接口localhost:3377/config/info的结果发生变化。