1.常见的注册中心
1.雅虎 —ZK zookeeper 2.Netfix— Eureka 3.Alibaba—Nacos----不仅可以作为注册中心,还可以作为配置中心 4.Google—Consul 选择上的时候,从社区活跃度,稳定性,功能,性能等方面进行考虑
2.Nacos
1>准备工作
1.确保配置了JAVA_HOME 2.确保你的MySQL版本为5.7以上(MariaDB10.5以上) 查看登陆以后数据库的信息: 1.登录后在命令行输入 status 2.查看端口号:show global variables like ‘port’; 3.登录数据库指定端口的: mysql -uroot -P3306 -p 登录3306端口数据库
2>nacos下载与安装
1.下载地址:https://github.com/alibaba/nacos/releases 2.选择对应版本直接下载 3.解压Nacos(最好不要解压到中文目录下),其目录结构如下
3>初始化配置
1.命令行登录mysql,执行sql脚本 source sql所在的绝对路径 执行成功以后,会创建一个nacos_config数据库,打开数据库会看到一些表,比如:
2.打开/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
4>服务启动与访问
1.在nacos的bin目录通过指令打开cmd命令行
Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式): ./startup.sh -m standalone Windows启动命令(standalone代表着单机模式运行,非集群模式): startup.cmd -m standalone
2.访问nacos服务 打开浏览器,输入http://localhost:8848/nacos 地址,出现如下登陆页面: 默认账号:nacos 默认密码:nacos
3.服务注册与调用
业务描述:服务者和消费者,都需要注册到nacosserver这个web服务中,服务提供者为消费者提供远端调用服务
1.生产者服务创建及注册
1>创建服务提供者工程,继承父工程,并设置pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>01-sca</artifactId>
<groupId>com.jt</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sca-provider</artifactId>
<dependencies>
<!--Web服务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--服务的注册和发现(我们要讲服务注册到nacos)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
2>创建并修改配置文件application.yml或者application.properties,实现服务注册,关键代码如下: 配置文件一般配置端口号 服务注册配置的服务名 以及nacos的服务地址
server:
port:8081 这是端口号
spring:
application:
name:sca-provider 这是配置的服务名
cloud:
nacos:
discovery: 这里提供服务和发现的配置
server-addr:localhost:8848 这是nacos的服务地址
注意: 服务名不要使用下划线,应使用横杠,这是规则.
3>创建启动类
package com.jt;
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
4>启动启动类,然后刷新nacos服务,检测服务是否注册成功,如图: 5>停掉sca-provider的服务,不断刷新nacos服务列表,检查服务的健康状态
2.消费者服务发现及调用
1>在sca-provider中创建服务提供对象,基于此对象,对外提供服务
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;
}
}
2>创建消费者工程,继承父工程,并且修改pom文件
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>01-sca</artifactId>
<groupId>com.jt</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>sca-consumer</artifactId>
<dependencies>
<!--Web服务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--服务的注册和发现(我们要讲服务注册到nacos)-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
</project>
3>创建消费端的配置文件application.yml
server:
port: 8090 设置服务消费端的端口号
spring:
application:
name: sca-consumer #服务注册时,服务名必须配置
cloud:
nacos:
discovery:
server-addr: localhost:8848 #从哪里去查找服务 就是nscos的地址
4>创建消费端的启动类
package com.jt;
@SpringBootApplication
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class,args);
}
}
5>在消费端启动类中添加如下方法,用于创建RestTemplate对象,消费端利用此对象实现远端调用服务端
@Bean
public RestTemplate restTemplate (){ //基于此对象,实现远端服务调用
return new RestTemplate ();
}
6>定义消费端的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;
/**
* 定义服务消费端Controller,在这个Controller对象
* 的方法中实现对远端服务sca-provider的调用
*/
@RestController
public class ConsumerController {
/**
* 从spring容器获取一个RestTemplate对象,
* 基于此对象实现远端服务调用
*/
@Autowired
private RestTemplate restTemplate;
/**
* 在此方法中通过一个RestTemplate对象调用远端sca-provider中的服务
* @return
* 访问此方法的url: http://localhost:8090/consumer/doRestEcho1
*/
@GetMapping("/consumer/doRestEcho1")
public String doRestEcho01(){
//1.定义要调用的远端服务的url
String url="http://localhost:8081/provider/echo/8090";
//2.基于restTemplate对象中的相关方法进行服务调用
return restTemplate.getForObject(url, String.class);
}
}
4.服务负载均衡设计及实现
业务描述:服务实例的并发访问比较大,会启动多个服务实例,让这些服务实例采用一定策略均衡(轮询,权重,随机,hash等)处理并发请求
1.LoadBalancerClient应用
LoadBalancerClient对象可以从nacos中基于服务名获取服务实例,然后在工程中基于特点算法实现负载均衡方式的调用 1.> 修改消费端controller对象,注入LoadBalancerClient对象,然后进行服务访问
@Autowired
private LoadBalancerClient loadBalancerClient;
/**
* 负载均衡方式的服务调用
* @return
*/
//http://ip:port/consumer/doRestEcho2
@GetMapping("/consumer/doRestEcho2")
public String doRestEcho02(){
//方案1:自己写负载均衡算法
//定义远端服务的url地址
//String url1="http://localhost:8081/provider/echo/{msg}";
//String url2="http://localhost:8082/provider/echo/{msg}";
//String[] urlArray={url1,url2};
//String url=urlArray[new Random().nextInt(urlArray.length)];
// 这里new Random().nextInt(urlArray.length)是随机数对象后边意思是小于数组长度的随机数
//基于RestTemplate借助http协议向远端服务发起Get请求
//return restTemplate.getForObject(url,
//String.class,serverPort);//String.class为url对应服务的响应结果类型
//方案2:从nacos中动态获取服务列表,并基于内置负载均衡算法获取服务实例 中介者模式
//1)基于服务名(这个名字是nacos注册中心中的一个服务名)获取服务实例
ServiceInstance serviceInstance =
loadBalancerClient.choose("sca-provider");//选择的是nacos中的dataid
//2)基于服务实例构建远端服务url
String url="http://%s:%s/provider/echo/{msg}";
String ip=serviceInstance.getHost();
int port=serviceInstance.getPort();
url=String.format(url,ip,port);//动态拼接成url
//3)进行远端服务调用
return restTemplate.getForObject(url,
String.class,serverPort);
}
2>打开idea服务启动配置,并修改为允许并发运行 3>修改sca-provider的配置文件端口,分别以8081,8082端口方式进行启动。
server:
port: 8082
spring:
application:
name: sca-provider
cloud:
nacos:
server-addr: localhost:8848
4>启动成功以后,访问nacos的服务列表,检测服务是否成功注册,如图所示: 5>启动sca-consumer项目模块,打开浏览器对consumer服务进行访问,访问时不断刷新,检测页面数据变化。 注意:多个实例并发提供服务的方式为负载均衡,这里的负载均衡实现默认是因为Nacos集成了Ribbon来实现的,Ribbon配合RestTemplate,可以非常容易的实现服务之间的访问。Ribbon是Spring Cloud核心组件之一,它提供的最重要的功能就是客户端的负载均衡(客户端可以采用一定算法,例如轮询访问,访问服务端实例信息),这个功能可以让我们轻松地将面向服务的REST模版请求自动转换成客户端负载均衡方式的服务调用。
核心知识点,常见问题总结
https://yutian.blog.csdn.net/article/details/123087753
|