概述
Nacos是一个应用于服务注册与发现,配置管理的平台。他孵化于Alibaba,成长于十年双十一的洪峰考验,沉淀了简单易用,稳定可靠,性能卓越的核心竞争力。
启动服务与访问
第一步:启动Nacos
- Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):
./startup.sh -m standalone
- Windows启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
第二步:访问Nacos
服务注册于调用入门
生产服务创建及注册
- 创建服务提供者工程,继承parent工程并添加web,nacos-discovery依赖
- 创建并修改application.yml文件
- 创建启动类
- 启动启动类,刷新Nacos服务,检查是否注册成功
消费者服务发现与调用
- 在提供者工程中创建服务提供方对象,基于此对象对外提供服务
- 创建消费者工程,继承parent工程,并添加web,nacos-discovery依赖
- 创建并修改application.yml文件
- 创建启动类
- 在启动类中创建RestTemplate对象
- 定义消费端Controller,在此对象方法内部实现远端服务调用
服务负载均衡设计及实现
- 修改ConsumerController类,注入LoadBalancerClient对象,并添加doRestEcho2方法然后进行服务访问
@Autowired
private LoadBalancerClient loadBalancerClient;
@Value("${server.port:8091}")
private String appName;
@GetMapping("/consumer/doRestEch02")
public String doRestEch02(){
//获取sca-provider服务实例
ServiceInstance choose = loadBalancerClient.choose("sca-provider");
//url路径
String format = String.format("http://%s:%s/provider/echo/%s", choose.getHost(), choose.getPort(), appName);
return restTemplate.getForObject(format, String.class);
}
- 修改sca-provider的配置文件端口,分别以8081,8082启动
server:
port: 8081
spring:
application:
name: sca-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848
- 启动成功后查看nacos的服务列表,检测服务是否注册成功
- 打开浏览器对consumer服务进行访问,访问时不断刷新,检测页面数据变化
基于Feign的远程服务调用
诞生背景
服务消费方基于rest方式请求服务提供方的服务时,一种直接的方式就是自己拼接url,拼接参数然后实现服务调用,但每次服务调用都需要这样拼接,代码量复杂且不易维护,此时Feign诞生
Feign是什么
Feign应用实践
- 第一步:在服务消费方,添加项目依赖,代码如下
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>2.2.6.RELEASE</version>
- 第二步:在启动类添加@EnableFeignClients注解,代码如下
@EnableFeignClients
@SpringBootApplication
public class ConsumerApplication {
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
@Bean
@LoadBalanced
public RestTemplate loadBalancedRestTemplate(){ return new RestTemplate();}
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class, args);
}
}
- 第三步:定义HTTP请求API,基于此API借助OpenFeign访问远端服务,代码如下
@FeignClient(name = "sca-provider",
contextId = "remoteProviderService",
fallbackFactory = ProviderFallbackFactory.class)
public interface RemoteProviderService {
@GetMapping("provider/echo/{string}")
String echoMessage(@PathVariable("string") String string);
}
- 第四步:创建FeignConsumerController中添加feign访问,代码如下
@RestController
@RequestMapping("/consumer")
public class FeignConsumerController {
@Autowired
private RemoteProviderService remoteProviderService;
@GetMapping("/echo/{msg}")
public String doFeignEcho(@PathVariable String msg){
return remoteProviderService.echoMessage(msg);
}
}
- 第五步:启动消费者服务直接通过feign客户端进行访问
Feign配置进阶实践
- 一个服务提供方通常会提供很多资源服务,服务消费方基于同一个服务提供方写了很多服务调用接口,此时假如没有指定contextId,服务启动就会失败,例如,假如在服务消费方再添加一个如下接口,消费方启动时就会启动失败,例如:
@FeignClient(name = "sca-provider")
public interface RemoteOtherService {
@GetMapping("doSomeThing")
String doSomeThing();
}
- 此时我们需要为远程调用服务接口指定一个contextid,作为远程服务调用的唯一标识
@FeignClient(name = "sca-provider",
contextId = "remoteProviderService")
public interface RemoteProviderService {
@GetMapping("provider/echo/{string}")
String echoMessage(@PathVariable("string") String string);
}
- 还有当我们远程服务调用超时或服务器不可用时该怎么办?(在Feign应用中通过FallbackFactory接口实现类进行默认的相关处理 )
@Component
public class ProviderFallbackFactory implements FallbackFactory<RemoteProviderService> {
@Override
public RemoteProviderService create(Throwable throwable) {
return (msg) -> {
return "请稍等一万年~~~";
};
}
}
- 在Feign访问接口中应用FallbackFactory对象
@FeignClient(name = "sca-provider",
contextId = "remoteProviderService",
fallbackFactory = ProviderFallbackFactory.class)
public interface RemoteProviderService {
@GetMapping("provider/echo/{string}")
String echoMessage(@PathVariable("string") String string);
}
- 在配置文件application.yml中添加配置,启动feign方式调用时服务中断处理机制
server:
port: 8090
spring:
application:
name: sca-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
feign:
hystrix:
enabled: true
Nacos配置入门
配置准备
- 添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
- 将application.yml改为bootstarp.yml(启动优先级更高) 并添加配置
config:
server-addr: localhost:8848
file-extension: yml
新建Nacos配置
- 打开Nacos配置中心,新建配置,其中Data ID的名字要与spring.application.name的值相同
@RefreshScope注解的应用
- @RefreshScope的作用是在配置中心的相关配置发生变化以后,能够及时看到类中属性值的更新
@RefreshScope
@Slf4j
@RestController
public class ProviderLogController {
@Value("${logging.level.com.jt:error}")
private String logLevel;
@GetMapping("/provider/log/doLog01")
public String doLog01(){
System.out.println("==doLog01==");
log.trace("==trace==");
log.debug("==debug==");
log.info("==info==");
log.warn("==warn==");
log.error("==error==");
return "log config text "+logLevel;
}
}
Nacos配置管理模型
- Nacos配置管理模型由三部分组成
- Namespace:命名空间,对不同的环境进⾏隔离,⽐如隔离开发环境和⽣产环境
- Group:分组,将若⼲个服务或者若⼲个配置集归为⼀组。
- Service/DataId:某⼀个服务或配置集,一般对应一个配置文件。