栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringCloud Alibaba学习笔记 ——(1)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringCloud Alibaba学习笔记 ——(1)

public String getUser() {

return “user”;

}

@GetMapping(“/user/{id}”)

public String getUser(@PathVaria 《一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义》无偿开源 威信搜索公众号【编程进阶路】 ble(“userId”) Integer userId) {

return “xxx”;

}

}

  1. 编写主类 (前提保证 nacos 必须运行)

package cn.gorit;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

// 服务注册不需要自己加进去

@SpringBootApplication

public class App {

public static void main(String[] args) {

SpringApplication.run(App.class);

}

}

可以看到服务自动被注册了

[](()2.3.3 使用 DiscoverClient 实现 RPC 远程调用

编写第二个 module

  1. 编写配置

spring:

application:

name: gorit-order

cloud:

nacos:

discovery:

server-addr: 127.0.0.1:8848

server:

port: 8081

  1. 编写服务层

package cn.gorit.service;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cloud.client.ServiceInstance;

import org.springframework.cloud.client.discovery.DiscoveryClient;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController

public class OrderService {

@Autowired

private DiscoveryClient discoveryClient;

@GetMapping(“/order”)

public Object getOrderToUser() {

// 1. 根据服务名称从 注册中心获取集群列表地址,得到的是集群列表

List instances = discoveryClient.getInstances(“gorit-member”);

// 2. 列表任意选择一个实现 rpc 调用,远程 rpc 调用 gorit-member 的服务

return instances.get(0);

}

}

  1. 运行类和上面一致,区别一下名称

[](()2.3.4 使用 rest 实现 RPC 远程调用

RestTemplate 不是 Spring Cloud Alibaba写的,本身 Spring 支持 Http 调用,实现 Http 调用

RPC 远程调用设计到本地的负载均衡算法【后期会在第七章专门介绍负载均衡算法】

  1. 从中心获取服务集群的列表

  2. 从列表中选择一个 负载均衡的算法:

  3. 一致性 hash 计算

  4. 轮训、权重

  5. 随机

采用 设计模式。策略模式

  1. 将 RestTemplate 类使用 Bean 注解,注入到 Spring 中

  2. 在 orderService 引入它。

package cn.gorit.service;

import cn.gorit.localbalance.LoadBalancer;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cloud.client.ServiceInstance;

import org.springframework.cloud.client.discovery.DiscoveryClient;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController

public class OrderService {

@Autowired

private DiscoveryClient discoveryClient;

@Autowired

private RestTemplate restTemplate;

@GetMapping(“/order”)

public Object getOrderToUser() {

// 1. 根据服务名称从 注册中心获取集群列表地址,得到的是集群列表

List instances = discoveryClient.getInstances(“gorit-member”);

// 2. 列表任意选择一个实现 rpc 调用,这里拿到地址,本地实现远程 rpc 调用 gorit-member 的服务

ServiceInstance serviceInstance = instances.get(0); // 一个问题,这里写死了,集群就没办法应用到负载均衡了。

// ip + 端口 + 调用加上接口名称

String result = restTemplate.getForObject(rpcMemberUrl.getUri()+“/user”, String.class);

return “订单调用会员返回结果:”+result;

}

}

[](()2.4 手写负载均衡轮训算法


在上面代码中,我们获取集群列表地址的时候,默认获取的是第一个,如果是在集群环境下,负载均衡就会失效,这里我们手写实现一个负载均衡实现的策略 —— 轮询

我们启动两个相同的 member 服务,来测试负载均衡。

在 gorit-member 的app 设置

并在 application.yml 中设置启动端口为 8082

启动项目

在 nacos 中,我们就可以看到 member 启动了两个,也就是说我们可以使用集群了

编写负载均衡轮询算法

  1. 创建 LoadBalancer 接口d

package cn.gorit.localbalance;

import org.springframework.cloud.client.ServiceInstance;

import java.util.List;

public interface LoadBalancer {

ServiceInstance getSingleAddress(List serviceInstanceList);

}

  1. 创建轮询实现类

package cn.gorit.localbalance;

import org.springframework.cloud.client.ServiceInstance;

import org.springframework.cloud.client.loadbalancer.LoadBalanced;

import org.springframework.stereotype.Component;

import java.util.List;

import java.util.concurrent.atomic.AtomicInteger;

@Component

public class RotationLoadBalancer implements LoadBalancer {

// 从 0 开始去计数

private AtomicInteger atomicInteger = new AtomicInteger(0);

@Override

public ServiceInstance getSingleAddress(List serviceInstanceList) {

int index = atomicInteger.incrementAndGet()%serviceInstanceList.size();

return serviceInstanceList.get(index);

}

}

  1. 修改 memberService 的接口为如下,以及 yml 配置,分别启动 8080 和 8082 端口

@GetMapping(“/user”)

public String getUser() {

return “user+ 8082”;

}

@GetMapping(“/user”)

public String getUser() {

return “user+ 8080”;

}

  1. 重写 order 的服务,并重启

package cn.gorit.service;

import cn.gorit.localbalance.LoadBalancer;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.cloud.client.ServiceInstance;

import org.springframework.cloud.client.discovery.DiscoveryClient;

import org.springframework.web.bind.annotation.GetMapping;

import org.springframework.web.bind.annotation.RestController;

import org.springframework.web.client.RestTemplate;

import java.util.List;

@RestController

public class OrderService {

@Autowired

private DiscoveryClient discoveryClient;

@Autowired

private RestTemplate restTemplate;

// 使用负载均衡器

@Autowired

private LoadBalancer loadBalancer;

@GetMapping(“/order”)

public Object getOrderToUser() {

// 1. 根据服务名称从 注册中心获取集群列表地址,得到的是集群列表

List instances = discoveryClient.getInstances(“gorit-member”);

// 2. 列表任意选择一个实现 rpc 调用,这里拿到地址,本地实现远程 rpc 调用 gorit-member 的服务

// ServiceInstance serviceInstance = instances.get(0); // 一个问题,这里写死了,集群就没办法应用到负载均衡了。

ServiceInstance rpcMemberUrl = loadBalancer.getSingleAddress(instances);

// ip + 端口 + 调用加上接口名称

String result = restTemplate.getForObject(rpcMemberUrl.getUri()+“/user”, String.class);

return “订单调用会员返回结果:”+result;

}

}

  1. 访问 localhost:8081/order 并刷新,我们写的负载均衡算法起效了。

[](()2.5 实现服务动态下线


我们在 nacos 手动使服务下线,可以看到 http://localhost:8081/order 就会自动切换为另一个集群的服务所在的端口

[](()2.6 Nacos 相关面试问题


  1. Nacos 与 Eureka 的区别?

最大区别:

Nacos 支持两种模式 CP/AP 模式,从 Nacos 1.0版本开始,模式就是 ap + cp 混合模式

Eureka 采用 ap 模式行驶实现注册中心

  1. Eureka 与 Nacos 底层实现集群协议哪些区别
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/863271.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号