目录
1.服务发现
1.1微服务特点
1.2服务发现案例
1.2.1概述
1.2.2搭建nacos服务
1.2.3创建工程
1.2.4启动访问即可
2.配置中心
2.1概述
2.2配置特点
2.3ncaos优点
2.4配置管理模型
2.5配置中心案例
2.5.1 创建命名空间
2.5.2在nacos-consumer 项目 中添加pom依赖
2.5.3在bootstrap.yml(一定是bootstrap.yml文件,不是application.yml文件)文件配置以下内容:
2.5.4项目结构
2.5.5写一个RestController,在Controller上添加 @RefreshScope 实现配置的热加载。代码如下:
2.5.6测试
2.5.7 配置中心拓展
1.服务发现
1.1微服务特点
- 服务层按业务拆分为一个一个的微服务。
- 微服务的职责单一。
- 微服务之间采用RESTful、RPC等轻量级协议传输。
- 有利于采用前后端分离架构。
1.2服务发现案例
1.2.1概述
在微服务架构中,整个系统会按职责能力划分为多个服务,通过服务之间协作来实现业务目标。这样在我们的代码 中免不了要进行服务间的远程调用,服务的消费方要调用服务的生产方,为了完成一次请求,消费方需要知道服务 生产方的网络位置(IP地址和端口号)。
我们的代码可以通过读取配置文件的方式读取服务生产方网络位置,如下:
1.2.2搭建nacos服务
1.2.3创建工程
父工程pom,xml
<modules>
<module>nacos-provider</module>
<module>nacos-consumer</module>
</modules>
<name>nacos</name>
<description>Demo project for Spring Boot</description>
<packaging>pom</packaging>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.3.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
nacos-provider pom.xml
<name>nacos-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<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>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>RELEASE</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
nacos-consumer pom.xml同上一样
application.yml 两个都一样修改appicatiion.name 服务名 和server.port 项目端口
server:
port: 56020
spring:
application:
name: nacos-rest-consumer
cloud:
nacos:
discovery:
server-addr: nacosIp:nacosPort # 默认端口8848
服务消费者controller
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
/**
* @author yd
* @version 1.0
* @date 2020/9/27 11:23
*/
@RestController
public class RestConsumerController {
/**
* 服务id即注册中心的中的服务名
*/
private String serviceId = "nacos-provider";
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping(value = "/service")
public String service() {
RestTemplate restTemplate = new RestTemplate();
ServiceInstance serviceInstance = loadBalancerClient.choose(serviceId);
URI uri = serviceInstance.getUri();
String forObject = restTemplate.getForObject(uri+"/service", String.class);
return "consumerinvoke" + forObject;
}
}
RestProviderController
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author yd
* @version 1.0
* @date 2020/9/27 11:16
*/
@RestController
public class RestProviderController {
/**
* 暴露服务
* @return
*/
@GetMapping(value = "/service")
public String service() {
System.out.println("provider invoke");
return "provider invoke";
}
}
1.2.4启动访问即可
2.配置中心
2.1概述
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数 据库连接参数、启动参数等。
微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移 (分割),这样配置就分散了,不仅如此,分散中还包含着冗余
2.2配置特点
- 配置项容易读取和修改
- 分布式环境下应用配置的可管理性,即提供远程管理配置的能力
- 可以查看配置修改的历史记录
- 不同部署环境下应用配置的隔离性
2.3ncaos优点
- 读写性能高
- 自带运维管理界面
- 阿里巴巴开源
2.4配置管理模型
对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。
- Namespace:代表不同环境,如开发、测试、生产环境。
- Group:代表某项目,如XX医疗项目、XX电商项目
- DataId:每个项目下往往有若干个工程,每个配置集(DataId)是一个工程的主配置文件
2.5配置中心案例
2.5.1 创建命名空间
命名空间->新建命名空间
新建配置
示例
common:
name: bushuangli--热加载
server:
port: 8089
2.5.2在nacos-consumer 项目 中添加pom依赖
<!--配置中心-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.5.3在bootstrap.yml(一定是bootstrap.yml文件,不是application.yml文件)文件配置以下内容:
spring:
cloud:
nacos:
discovery:
server-addr: nacosip:nacosport
cluster-name: DEFAULT # 默认集群,可不填写
config:
file-extension: yaml #nacos选的配置格式
group: DEFAULT_GROUP # nacosgroup
namespace: 8ee806e0-6fa8-4842-a051-6f55df4972bc # nacos命名空间
server-addr: nacosip:nacosport
cluster-name: DEFAULT # 默认集群,可不填写
prefix: nacos-rest-consumer #prefix 默认为 spring.application.name 的值
2.5.4项目结构
2.5.5写一个RestController,在Controller上添加 @RefreshScope 实现配置的热加载。代码如下:
/**
* RefreshScope 配置热加载
* @author BSL
*/
@RestController
@RefreshScope
public class RestConsumerController {
/**
* 服务id即注册中心的中的服务名
*/
private String serviceId = "nacos-provider";
@Value("${common.name}")
private String common_name;
@GetMapping(value = "/configs")
public String getvalue(){
return common_name;
}
@Autowired
private ConfigurableApplicationContext applicationContext;
@GetMapping(value = "/configs2")
public String getvalue2(){
String common_name = applicationContext.getEnvironment().getProperty("common.name");
return common_name;
}
@Autowired
LoadBalancerClient loadBalancerClient;
@GetMapping(value = "/service")
public String service() {
RestTemplate restTemplate = new RestTemplate();
ServiceInstance serviceInstance = loadBalancerClient.choose(serviceId);
URI uri = serviceInstance.getUri();
String forObject = restTemplate.getForObject(uri+"/service", String.class);
return "consumerinvoke" + forObject;
}
}
2.5.6测试
启动工程nacos-consumer ,在浏览器上访问localhost:8089/configs,可以返回在nacos控制台上配置的common.name。在nacos 网页上更改common.name的配置,在不重启nacos-provider工程的情况下,重新访问localhost:8089/configs,返回的事修改后的值,可见nacos作为配置中心实现了热加载功能。
2.5.7 配置中心拓展
在使用Spring Cloud配合Nacos Config作为配置中心来使用的时候,Nacos支持对多个环境的配置管理,通常通过命名空间来实现,比如
public、dev,而如果使用同一个配置中心有多个项目组或者团队或者不同的模块管理的时候,通常使用Group来区分Nacos Config相关的配置详情,在官方文档中都有过介绍,通过阅读可以了解,https://github.com/spring-cloud-incubator/spring-cloud-alibaba/wiki/Nacos-config
如果想支持对多个配置文件的使用,bootstrap.yml 需要用到ext-config
创建一个新配置
bootstrap.yml
spring:
cloud:
nacos:
discovery:
server-addr: nacosip:nacosport
cluster-name: DEFAULT # 默认集群,可不填写
config:
server-addr: nacosip:nacosport
cluster-name: DEFAULT # 默认集群,可不填写
prefix: nacos-rest-consumer #prefix 默认为 spring.application.name 的值
file-extension: yaml #file-exetension 为配置内容的数据格式
namespace: 8ee806e0-6fa8-4842-a051-6f55df4972bc # nacose 命名空间id
ext-config:
- data-id: nacos-rest-consumer.yaml
group: DEFAULT_GROUP
- data-id: nacos-consumer-data-source.yaml # Nacos上配置集的ID,这里要注意的是这个 data-id一定要有后缀名
group: MYSQL # 自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP
refresh: true # 控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是false,代表启动时获取一次
上面案例中配置了两个拓展配置集分别分配在DEFAULT_GROUP和MYSQL 组上,其中nacos-rest-consumer.yaml不实时刷新,这里nacos-consumer-data-source.yaml优先级大于nacos-rest-consumer.yaml,因为优先级大小的排序是extension-configs[n]中n越大优先级越大,配置集的配置值就越优先
- data-id:Nacos上配置集的ID,这里要注意的是这个data-id一定要有后缀名
- group:自定义 Data Id 所在的组,不明确配置的话,默认是 DEFAULT_GROUP
- refresh:控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是false,代表启动时获取一次
controller
@Value("${datasource2.root}")
private String root;
@GetMapping(value = "/configs3")
public String getvalue3(){
return root;
}