一、Nacos
1、 为什么选择Nacos?
在微服务中,首先需要面对的问题就是如何查找服务(软件即服务),其次,就是如何在不同的服务之间进行通信?如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系的纽带,由此注册中心诞生(例如淘宝网卖家提供服务,买家调用服务)。
Nacos(DynamicNaming and Configuration Service)是一个应用于服务注册与发现、配置管理的平台。它孵化于阿里巴巴,成长于十年双十一的洪峰考验,沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。
https://nacos.io/zh-cn/docs/quick-start.html
2、服务启动与访问
所有系统中的指令在执行时,首先会从执行指令的当前目录查找指令,假如当前路径没有这个指令,则从操作系统中配置的path环境变量中去查找。
假如path环境变量中也没有找到这个指令,则会提示不是内部或外部命令。
1)Windows启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
2)Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):
./startup.sh -m standalone
注意:JVM的新生代和老年代
3、在idea中启动nacos
利用脚本 shell script
二、部分知识补充1
java.net
ServerSocket 会启动一个线程池。并发处理客户端请求,
当线程多时,未处理的任务会形成队列,形成阻塞队列。
底层发送心跳包。
补充1:
1)/provider/echo/{msg}
接收用( @PathVariable(“msg”) String msgs )
2)tomcat服务器默认服务端口是8080
@Value("${server.port:8080}")
private String provider;
server.port: 8080
value读取的是配置文件yml中的
3)当服务启动时会向nacos发送心跳包(5秒一次)
nacos 15s检查不到心跳包,会把服务标识为非健康状态。监听到30s左右没有心跳包就认为服务已经死掉。
nacos底层是把服务放到map中。 K是服务名,不能重复。V是一个List集合。List<>。
注册是把服务写到内存中。
503 标识服务不可用 处于不健康状态
三、部分知识补充2
1.先写pom.xml (web和cloud alibaba)
2.写yml配置文件 (端口号、)
3.写启动类
我们访问一个订单模块数据(例如“我的订单”),订单模块中还要呈现商品信息。
商品信息是服务的提供方,订单模块是服务的消费方。
API : 类和接口 亦或者是 一个请求路径
封装:1)狭义:属性私有化,方法能公开则公开
2)广义:一个系统由哪些服务构成,一个服务由哪些模块构成,一个模块由哪些对象构成,一个对象由哪些属性和方法构成
1.定义要调用的API
2.谁去访问这个API
如何整合第三方的Bean?
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
构建RestTemplate对象,并将此对象交给spring管理。
后续我们会通过此对象进行远程服务调用
@Bean(“指定的名字”)
使用后,如果后台有对象,不会在调用此方法,保证spring管理的只有一个对象
补充:
500服务器异常。先查看服务器的报错。
ctrl+n 快速查找
ctrl+f12 查看
ctrl+h 查看继承体系
负载均衡
设计模式、策略(算法)
轮询策略
方法一负载均衡:
//1.从注册中心获取服务实例
ServiceInstance instance = loadBalancerClient.choose("sca-provider");
//2.基于restTemplate进行服务实例调用
String ip = instance.getHost();
int port = instance.getPort();
//String url="http://"+ip+":"+port+"/provider/echo/"+appName;
String url=String.format("http://%s:%s/provider/echo/%s",ip,port,appName);
browser-(url)–consumer-(url)–provider
browser-provider
browser-consumer
方法二负载均衡:
@Bean
@LoadBalanced
public RestTemplate loadrestTemplate(){
return new RestTemplate();
}
@Autowired
private RestTemplate loadrestTemplate;
/*依赖注入,首先先看类型,其次看方法名。*/
public String doRestEcho3(){
String url=String.format("http://sca-provider/provider/echo/%s", appName);
return loadrestTemplate.getForObject(url,String.class);
}
楼的壁垒瑟克兰德
此处拦截器:实现了服务负载均衡
在使用拦截器的情况下,性能会低。