- nacos准备工作
- 1.配置java环境变量
- 2.下载与安装nacos
- 3.解压nacos
- 4.在sql脚本中添加如下内容
- 5.初始化配置
- 6.启动nacos
- 7.访问nacos服务
- 一. 注册服务
- 1.添加依赖
- 2.启动nacos服务
- 3.编辑配置文件
- 二. 服务间普通调用
- 1.创建provider工程类
- 2.创建consumer工程类
- 三. 负载均衡方式调用
- 1.设置IDEA多启动
- 2.修改consumer服务
- 3.优化代码结构:feign
- (1). 失败回调机制
- 一. 配置中心
- 1.IDEA连接数据库
- 2.创建日志对象
- 3.添加依赖
- 4.修改配置文件
- 5.新建nacos配置
- 6.启动服务,访问即可
- 7.日志级别显示在浏览器
- * 配置IDEA启动nacos
- 二.Nacos配置管理模型
- 1.命名空间
- 2.修改配置文件
- 3.新建分组
- 4.新建Controller测试
- * 共享配置设计及读取
- 下载网址
https://github.com/alibaba/nacos/releases
- 选择对应版本
注意:
- 路径不要有中文和空格
- 确保你的MySQL版本为5.7以上(MariaDB10.5以上)
DROP DATAbase IF EXISTS `nacos_config`; CREATE DATAbase `nacos_config` DEFAULT character set utf8mb4; SET names utf8mb4; SET FOREIGN_KEY_CHECKS = 0; USE `nacos_config`;
注意:
- 在最上面添加上述内容
- 不弱不添加上述内容,可以先创建数据库在将sql脚本导入数据库即可
- 登陆mysql,执行老师发给同学们的sql脚本。例如,我们可以使用mysql自带客户端,在命令行首先登录mysql,然后执行如下指令:
执行成功后会创建一个nacos_config数据库 - 打开/conf/application.properties里打开默认配置,并基于你当前环境配置要连接的数据库,连接数据库时使用的用户名和密码(假如前面有"#"要将其去掉):
### If use MySQL as datasource: 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_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0=root db.password.0=root6.启动nacos
Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):
./startup.sh -m standalone
Windows启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
注意:
1)执行启动令时要么配置环境变量,要么直接在nacos/bin目录下去执行.
2)nacos启动时需要本地环境变量中配置了JAVA_HOME(对应jdk的安装目录),
3)一定要确保你连接的数据库(nacos_config)是存在的.
4)假如所有的配置都正确,还连不上,检查一下你有几个数据库(mysql,…)
输入下面网址
http://localhost:8848/nacos
**提示:**默认账户和密码:nacos
一. 注册服务 1.添加依赖- 添加服务注册和发现依赖
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
- 添加SpringBoot-web依赖
2.启动nacos服务org.springframework.boot spring-boot-starter-web
startup.cmd -m standalone3.编辑配置文件
- 创建并修改配置文件application.yml(或者application.properties),实现服务注册
server:
port: 8081
spring:
application:
name: sca-provider #进行服务注册必须配置服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 如果nacos在本机,此处可省略
- 启动provider即可注册成功
1.在sca-provider项目中创建服务提供方对象,基于此对象对外提供服务
package com.jt.provider.controller;
@RestController
public class ProviderController{
//@Value默认读取项目配置文件中配置的内容
//8080为没有读到server.port的值时,给定的默认值
@Value("${server.port:8080}")
private String server;
//http://localhost:8081/provider/echo/tedu
@GetMapping("/provider/echo/{msg}")
public String doRestEcho1(@PathVariable String msg){
return server+" say hello "+msg;
}
}
2.创建consumer工程类
- 编辑pom文件
01-sca com.jt 1.0-SNAPSHOT 4.0.0 sca-consumer org.springframework.boot spring-boot-starter-web com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
- 修改配置文件
server:
port: 8090
spring:
application:
name: sca-consumer #这里提供服务名,要进行服务注册,则是nacos服务列表中的服务名
cloud:
nacos:
discovery:
server-addr: localhost:8848
# 实际注册中这里需要写nacos的具体ip地址和端口号。8848时本机默认端口号。
feign:
hystrix:
enabled: true
- 创建启动类
- 在启动类中添加方法,用于创建RestTemplate对象,实现服务之间条用
@Bean
//@Bean("rt")
//@Scope("singleton")
//@ConditionalOnMissingBean //spring容器没有这个bean时它才会生效.
public RestTemplate restTemplate(){
return new RestTemplate();
}
- 定义服务消费端Controller
package com.jt.consumer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class ConsumerController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/doRestEcho1")
public String doRestEcho01(){
//1.定义要调用的远端服务的url
String url="http://localhost:8081/provider/echo/8090";
//2.基于restTemplate对象中的相关方法进行服务调用
return restTemplate.getForObject(url, String.class);
}
}
- 访问 http://localhost:8090/consumer/doRestEcho1,测试成功即可
通过修改配置文件端口可启动多个
可实现启动多个tomcat服务器
- 修改ConsumerController类,注入LoadBalancerClient对象,并添加doRestEcho2方法,然后进行服务访问.
@Autowired
private LoadBalancerClient loadBalancerClient;
@GetMapping("/consumer/doRestEcho02")
public String doRestEcho02(){
ServiceInstance serviceInstance = loadBalancerClient.choose("sca-provider");
String url = String.format("http://%s:%s/provider/echo/%s",serviceInstance.getHost(),serviceInstance.getPort(),appName);
System.out.println("request url:"+url);
return restTemplate.getForObject(url, String.class);
}
}
**提示:**底层基于Ribbon实现负载均衡算法
2. 启动两个provider服务,启动一个consumer服务
3. 访问consumer服务,出现不同的端口号即可
http://localhost:8090/consumer/doRestEcho023.优化代码结构:feign
- 添加Feign依赖
org.springframework.cloud spring-cloud-starter-openfeign
- 在启动类上添加注解
@EnableFeignClients
@SpringBootApplication
public class ConsumerApplication {…}
- 定义Http请求API,基于此API借助OpenFeign访问远端服务,代码如下:
package com.jt.consumer.service;
@FeignClient(name="sca-provider")//sca-provider为服务提供者名称
public interface RemoteProviderService{
@GetMapping("/provider/echo/{string}")//前提是远端需要有这个服务
public String echoMessage(@PathVariable("string") String string);
}
- 创建FeignConsumerController中并添加feign访问,如下:
package com.jt.consumer.controller;
@RestController
@RequestMapping("/consumer/ ")
public class FeignConsumerController {
@Autowired
private RemoteProviderService remoteProviderService;
@GetMapping("/echo/{msg}")
public String doFeignEcho(@PathVariable String msg){
//基于feign方式进行远端服务调用(前提是服务必须存在)
return remoteProviderService.echoMessage(msg);
}
}
- 启动消费者服务,在浏览器中直接通过feign客户端进行访问,如图所示(反复刷新检测其响应结果)
http://localhost:8090/consumer/echo/8090(1). 失败回调机制
-
远程服务回调工厂,定义远端回调接口
-
实现FallbackFactory接口(Feign提供的),泛型就是我们字节定义的回调接口
-
在配置文件application.yml中添加如下配置,启动feign方式调用时的服务中断处理机制.
feign:
hystrix:
enabled: true #默认值为false
- 在服务提供方对应的调用方法中添加Thread.sleep(500000)模拟耗时操作,然后启动服务进行访问测试.
- 选择数据库
- 填加相关信息,并下载驱动
- 选择nacos_config数据库
**注意:**如果右侧没有三个点,可以右击:Database Tools - Manage Shown Schemas -
再选对应数据库即可
- 创建日志对象类
package com.jt.provider.controller;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
//@Slf4j
@RestController
public class ProviderLogController {
//创建一个日志对象
//org.slf4j.Logger (Java中的日志API规范,基于这个规范有Log4J,Logback等日志库)
//org.slf4j.LoggerFactory
//log对象在哪个类中创建,getLogger方法中的就传入哪个类的字节码对象
//记住:以后只要Java中使用日志对象,你就采用下面之中方式创建即可.
//假如在log对象所在的类上使用了@Slf4j注解,log不再需要我们手动创建,lombok会帮我们创建
private static Logger log=
LoggerFactory.getLogger(ProviderLogController.class);
@GetMapping("/provider/log/doLog01")
public String doLog01(){//trace
3.添加依赖
- 添加配置中心依赖,在provider工程中
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-config
添加以后,这些类就可以从nacos配置中心读取配置信息
4.修改配置文件
- 将项目sca-provider的application.yml的名字修改为bootstrap.yml(启动优先级最高),并添加配置中心配置
spring:
application:
name: sca-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
config:
server-addr: 127.0.0.1:8848
file-extension: yml # Configure the data format of the content, default to properties
5.新建nacos配置
6.启动服务,访问即可
7.日志级别显示在浏览器
**注意:**在此类上加注解:@RefreshScope 可以实现动态读取级别,不用重构对象
* 配置IDEA启动nacos
- 为了方便启动nacos,(可不配)
配置好后在IDEA启动即可,操作台在IDEA中和cmd一样
二.Nacos配置管理模型
1.命名空间
- 创建新命名空间
- 在指定命名空间下添加配置,也可以直接取配置列表中克隆
- 此时修改dev命名空间中Data Id的sca-provider配置
2.修改配置文件
- 修改项目provider中的配置文件bootstrap.yml,添加如下配置
namespace: 00c9600a-73c7-47be-920c-74d8bf195a45 #默认命名空间为public
3.新建分组
- 在新建配置时指定分组名称
- 修改boostrap.yml配置类,在其内部指定我们刚刚创建的分组
server:
port: 8081
spring:
application:
name: sca-provider
cloud:
nacos:
discovery: #假如nacos和你的服务在一台电脑上
server-addr: localhost:8848 #默认向本机的nacos进行注册,这个地址可以不配置
config:
server-addr: localhost:8848 #配置中心地址
file-extension: yml #定义配置中心配置的格式
namespace: 00c9600a-73c7-47be-920c-74d8bf195a45 #默认命名空间为public
group: DEFAULT_GROUP_51
shared-configs[0]:
data-id: app-public.yml #这个名字为nacos中指定命名空间的一个dataId
refresh: true #配置中心内容发生变化,是否支持动态刷新
4.新建Controller测试
- 测试是否启用本地缓存的配置
package com.jt.provider.controller;
@RefreshScope
@RestController
public class ProviderCacheController {
@Value("${useLocalCache:false}")
private boolean useLocalCache;
@RequestMapping("/provider/cache01")
public String doUseLocalCache01(){
return "useLocalCache'value is "+useLocalCache;
}
- 访问测试
* 共享配置设计及读取
- 在nacos中创建一个共享配置文件
**提示:**其中,这里的secret可以理解为一个密钥。后期单点登录也用到这种设计 - 在指定的微服务配置文件(bootstrap.yml)中设置对共享配置文件的读取
spring:
application:
name: sca-provider
cloud:
nacos:
config:
server-addr: localhost:8848
# 命名空间
namespace: 83ed55a5-1dd9-4b84-a5fe-a734e4a6ec6d
# 分组名
# group: DEFAULT_GROUP
# 配置中心文件扩展名
file-extension: yml
# 共享配置
shared-configs[0]:
data-id: app-public.yml
refresh: true #默认false,共享配置更新,引用此配置的地方是否要更新
- 在指定的Controller类中读取和应用共享配置即可
package com.jt.provider.controller;
@RefreshScope
@RestController
public class ProviderSecretController {
@Value("${app.secret:123456}")
private String secret;
@GetMapping("/provider/secret")
public String doGetSecret(){
//return String.format()
return "The Secret is "+secret;
}
}
**提示:**共享配置的读取.
* 1)为什么会有共享配置?(很多配置中有一些共性)
* 2)共享配置在配置文件中的一种引用方式 share-configs[0]:
4. 启动服务,然后打开浏览器进行访问测试读取共享配置
本章结束!



