分布式部署 在端口号为 8082 和 8083 的两个实例中 进行 轮播 和随机 使用 nacos 进行操作
nacos的作用就是一个注册中心,用来管理注册上来的各个微服务
下载安装并启动 nacos
1、下载nacos
下载地址: Releases · alibaba/nacos · GitHub
下载zip格式的安装包,然后进行解压缩操作
1.4.1的下载地址是:
2、启动 nacos
在 nacos 的 bin 目录 进行启动 两种方式
一种 在 Xshell 启动 .sh 一种在 windows 启动 cmd
不以集群启动,以个例启动 windows
startup.cmd -m standalone
linux启动的时候使用的命令是:sh startup.sh -m standalone
第3步: 访问nacos
打开浏览器输入http://localhost:8848/nacos,即可访问服务, 默认密码是nacos/nacos
将product微服务注册到nacos
1.在pom.xml中添加nacos的依赖 添加在 订单消费者的pom文件中
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2. 在主启动类上添加nacos的开启注解
@EnableDiscoveryClient
3. 在application.properties添加nacos的配置
a.设置微服务的名字
b.设置端口号
c.添加到注册中心,将该服务交给注册中心去管理
application.properties相关内容如下:
server.port=8081
# 将微服务注册到注册中心 localhost:8848
spring.cloud.nacos.discovery.server-addr=localhost:8848
# 微服务的名字
spring.application.name=order
开启注解,能够让注册中心扫描到该服务
@EnableDiscoveryClient
注册成功
点击详情 如果最后一位是 1 则需要 更改 ip 改为自己的
找到网络适配器
重启项目,查看详情
将 订单 和 商品 放在 service 里边
然后更改 pom 文件里边的配置 相同的放在 sys-service 里边
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.aaa</groupId>
<artifactId>sys-comm</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
</dependencies>
然后 更改 order pro pro1 改 service 为父亲
然后更改 application.properties 两个 pro pro1 相同 接着打开 nacos
product 里边有两个微服务 点击详情显示
部署小集群
微服务里面写两个一模一样的项目(端口号不一样) 注册到 nacos 里面
负载均衡 (实现轮询 和 随机的效果)
什么是负载均衡
通俗的讲, 负载均衡就是将负载(工作任务,访问请求)进行分摊到多个操作单元(服务器,组件)上 进行执行。
使用负载均衡
Spring Cloud Dubbo 从 2021.0.1.0 起已被移除出主干,不再随主干演进
轮询算法
使用的时候必须加jar 在service 里边
在 orderController 里边 注入 Bean
@Resource
private LoadBalancerClient loadBalancerClient;
代码实现
@GetMapping("addOrder2/{pid}")
public Object addDrder2( @PathVariable Integer pid){
ServiceInstance choose = loadBalancerClient.choose("product");
// product 在application.preporties里边的 名称
String requestMsg = "方式二 GET 请求 RibbonServer";
String url = String.format("http://%s:%s", choose.getHost(), choose.getPort() + "/pro/"+pid);
//1.根据商品的id得到商品的信息
Product forObject = restTemplate.getForObject(url ,Product.class);
return forObject;
}
成功效果图
随机算法
注入Bean
@Resource
private DiscoveryClient discoveryClient; // 发现客户端
代码实现
// 随机算法
@GetMapping("addOrder3/{pid}")
public Object addDrder3( @PathVariable Integer pid){
// 获取项目名 有可能是集群 所以是 List
List<ServiceInstance> product = discoveryClient.getInstances("product");
// 获取 ServiceInstance 里边的 端口号 和 IP 地址 的个数
int size = product.size();
// 索引小于 size 整数 最大值为 size - 1
int i = new Random().nextInt(size);
ServiceInstance choose = product.get(i);
String url = String.format("http://%s:%s", choose.getHost(), choose.getPort() + "/pro/"+pid);
System.out.println("***"+url);
//1.根据商品的id得到商品的信息
Product forObject = restTemplate.getForObject(url ,Product.class);
return forObject;
}
成功效果图
使用 feign 实现服务调用
FeignClient和RestTemplate
SpirngCloud 中,默认是使用HTTP进行微服务间通信,其中最常用的有两种实现形式
RestTemplate
Feign
RestTempale
其实在SpringWeb里面,已经原生支持了 RestTemplate,只不过我们一般使用的是把请求URL直接写死,而不是通过服务名的形式来调用,但是在微服务架构中,因为有了注册中心的存在,我们的负载均衡可以不需要使用第三方软件或者硬件实现了,所有,我们最佳的方式是经过服务名访问,请求到那个实例,由 负载均衡策略来替我们决定。
使用 feign 需要加上一个 jar 包 负载均衡策略 默认是 轮询
在启动类(消费者)的 pom 文件
<!--使用openFeign-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
开始使用 openfeign
在启动类(消费者)上边写入开启使用的 @EnableFeignClients 注解
微服务之间的调用 写一个接口
在写一个 Controller 进行调用
进行访问
更改 OpenFeign 的默认策略 变为随机
加配置文件 ---> 创建config
代码实现 随机策略
package com.aaa.config;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.loadbalancer.core.RandomLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ReactorLoadBalancer;
import org.springframework.cloud.loadbalancer.core.ServiceInstanceListSupplier;
import org.springframework.cloud.loadbalancer.support.LoadBalancerClientFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.core.env.Environment;
public class LoadBalancerConfig {
@Bean
ReactorLoadBalancer<ServiceInstance> randomLoadBalancer(Environment environment,
LoadBalancerClientFactory loadBalancerClientFactory) {
String name = environment.getProperty(LoadBalancerClientFactory.PROPERTY_NAME); //loadbalancer.client.name
// 对应的需要进行负载均衡的名字是什么 LoadBalancerClientFactory.PROPERTY_NAME
System.out.println("======"+name);
// product
return new RandomLoadBalancer(loadBalancerClientFactory.getLazyProvider(name, ServiceInstanceListSupplier.class), name);
}
}
在 启动类 (order 消费者) 里加入 注解
单个使用
@LoadBalancerClient(value = "product",configuration= LoadBalancerConfig.class)
多个使用
@LoadBalancerClients(
defaultConfiguration = LoadBalancerConfig.class
// product 会使用这个策略
// @LoadBalancerClient(value = "product",configuration= LoadBalancerConfig.class)
)
启动微服务 ,调用路径
服务熔断
写一个实现类 ProFeignImpl
package com.aaa.service;
import com.aaa.Product;
import org.springframework.stereotype.Service;
@Service
public class ProFeignImpl implements ProFeign {
@Override
public Product getProById(Integer id) {
return new Product(0,"出错啦");
}
}
然后在接口上写
开启 feign 对 sentinel 的支持
在消费者的 application.properties
重启服务