目录
注册中心
背景分析
Nacos概述
构建Nacos服务
1.配置环境
idea运行mysql
nacos的访问
访问是在bin目录下cmd执行启动
或者使用idea进行启动
细节说明:
访问Nacos服务
业务描述
生产者服务的创建(module名为sca-provider,继承工程01-sca)
创建服务消费者工程(module名为sca-consumer,假如已有则无需创建),继承parent工程(01-sca)
对服务提供者和服务消费者进行注册(在nacos上)
对sca-provider进行注册
对sca-consumer进行相同的修改,实现nacos注册,并观察其健康数
小杰分析
服务负载均衡设计及实现(重点)
业务描述
LoadBalancerClient应用
在微服务中,首先需要面对的问题就是如何查找服务(软件即服务),其次,就是如何在不同的服务之间进行通信?如何更好更方便的管理应用中的每一个服务,如何建立各个服务之间联系的纽带,由此注册中心诞生(例如淘宝网卖家提供服务,买家调用服务)。
市面上常用注册中心有Zookeeper(雅虎Apache),Eureka(Netfix),Nacos(Alibaba),Consul(Google),那他们分别都有什么特点,我们如何进行选型呢?我们主要从社区活跃度,稳定性,功能,性能等方面进行考虑即可.本次微服务的学习,我们选择Nacos,它很好的支持了阿里的双11活动,不仅可以做注册中心,还可以作为配置中心,稳定性和性能都很好。
Nacos(DynamicNaming and Configuration Service)是一个应用于服务注册与发现、配置管理的平台。它孵化于阿里巴巴,成长于十年双十一的洪峰考验,沉淀了简单易用、稳定可靠、性能卓越的核心竞争力。其官网地址如下:
Nacos 快速开始
1.配置JAVA_HOME的环境变量,他的地址是jdk8的详细地址
2.确保你的mysql地址是5.7以上,或者mariaDB10.3以上
3.下载与安装nacos(网站很卡)
Releases · alibaba/nacos · GitHub
4.找到对应的版本进行下载(.gz是Linux系统的版本,.zip是windows的下载版本,其他两个是源码)
5.第三步,解压文件夹
6.nacos初始化配置
执行sql脚本文件/nacos/conf/nacos-mysql.sql(注意:nacos中的sql脚本文件没有创建库函数,如果需要使用,要先加入库函数的创建)如有需要sql文件,评论区留言,本人第一次写文章,不会加入文件,或者有会的大佬,可以在评论去教一下我。
mysql的登录
最后点击Test Connection进行测试,观察MySQL的登陆是否成功
7.打开/nacos/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=root
Windows启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):
./startup.sh -m standalone
第一步,找启动管理界面
第二步,点击+号,找Shell Script
第三步:按图配置内容
说明:
1)执行执行令时要么配置环境变量,要么直接在nacos/bin目录下去执行.
2)nacos启动时需要本地环境变量中配置了JAVA_HOME(对应jdk的安装目录),
3)一定要确保你连接的数据库(nacos_config)是存在的.
4)假如所有的配置都正确,还连不上,检查一下你有几个数据库(mysql,…)
打开浏览器,输入http://localhost:8848/nacos地址,出现如下登陆页面:
其中,默认账号密码为nacos/nacos
我们需要创建两个项目Module分别为服务提供者和服务消费者(假如之前是跟着我的贴子做的则无需创建),然后服务提供者可以为服务消费者提供远端调用服务(例如支付服务为服务提供方,订单服务为服务消费方),
1.pom.xml添加依赖web的依赖
org.springframework.boot spring-boot-starter-web
2.创建配置文件application.yml,配置文件格式严格,一定要按格式写
server: port: 8081 spring: application: name: sca-provider #进行服务注册必须配置服务名
3.创建启动类
package com.jt;
@SpringBootApplication
public class ProviderApplication {public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
4.在sca-provider项目中创建服务提供方对象,基于此对象对外提供服务(由于需要和前端进行交互,所以需要加入controller层的注解,然后用value设置端口号,文中为默认获取application.yml的端口信息)
package com.jt.provider.controller;
/**定义Controller对象(这个对象在spring mvc中给他的定义是handler),
* 基于此对象处理客户端的请求*/
@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;
}
}
1.pom.xml中添加依赖如下:
org.springframework.boot spring-boot-starter-web
2.创建配置文件application.yml,配置文件格式严格,一定要按格式写
server: port: 8090 spring: application: name: sca-consumer #服务注册时,服务名必须配置
3.创建启动类
package com.jt; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication public class ConsumerApplication { public static void main(String[] args) { SpringApplication.run(ConsumerApplication.class, args); } }
4.在启动类中创建RestTemplate对象(@bean注解是spring Ioc的注解,用来把创建的对象交给spring'管理,一般和@Configuration连用。RestTemplate spring中的用来进行远程传输的类)
@Bean//远端调用工具RestTemplate,spring固有传输类 public RestTemplate restTemplate(){ return new RestTemplate(); }
5.定义sca-consumer服务的消费端Controller,在此对象方法内部实现远端服务调用(因为要和前端进行互联,所以我们使用controller注解,然后对远程调用(RestTemplate对象)进行依赖注入,创建sul为sca-provider的前端调用的地址,使用getForObject方法对sca-provider对象的返回值进行获取并展示(getForObject方法的第一个参数是url是地址值,第二个参数是你所调用的方法的返回值类型))
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 doRestEcho1(){ //你要调用的nacos上的另一个需要调用的信息的地址 String url="http://localhost:8081/provider/echo/sca-consumer"; return restTemplate.getForObject(url, String.class //你调用的方法的返回值类型 ); } }
同时开启两个启动类,并使用localhost:8090/consumer/doRestEcho2进行互联,结果显示为
pom.xml添加依赖(这个依赖会每5秒对nacos发送一个心跳包,让nacos检测到注册类的健康指数,当你关闭启动类,不停刷新nacos,你可以观察到sca-provider的健康指数会从1变为0,再到sca-provider被nacos毁灭的现象)
com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
application.yml的修改(文中为修改之后的样子)
server: port: 8090 spring: application: name: sca-consumer #服务注册时,服务名必须配置 cloud: nacos: discovery: server-addr: localhost:8848 #从哪里去查找服务
修改完成之后,开启启动类,可以观察到已经注册成功
为什么要将服务注册到nacos?(为了更好的查找这些服务)
在Nacos中服务提供者是如何向Nacos注册中心(Registry)续约的?(5秒心跳)
对于Nacos服务来讲它是如何判定服务实例的状态?(检测心跳包,15,30)
服务消费方是如何调用服务提供方的服务的?(RestTemplate)
一个服务实例可以处理请求是有限的,假如服务实例的并发访问比较大,我们会启动多个服务实例,让这些服务实例采用一定策略均衡(轮询,权重,随机,hash等)的处理并发请求,在Nacos中服务的负载均衡(Nacos客户端负载均衡)是如何应用的?
LoadBalancerClient对象可以从nacos中基于服务名获取服务实例,然后在工程中基于特点算法实现负载均衡方式的调用,案例实现如下:(在ConsumerController类中加入如下代码)
@Autowired(LoadBalancerClient用来从nacos中获取数据) private LoadBalancerClient loadBalancerClient; @Value("${spring.application.name:8090}") public String appName;(本类注册的接口的名字) @GetMapping("/consumer/doRestEcho2") public String doRestEcho02(){ ServiceInstance serviceInstance = //获取sca-provider的信息 loadBalancerClient.choose("sca-provider"); //%s代表占位符,serviceInstance.getInstanceId()解释前边的占位符 String url=String.format("http://%s/provider/echo/%s", serviceInstance.getInstanceId(),serviceInstance.getServiceId()); return restTemplate.getForObject(url,String.class); } }