02.SpringcloudAlibaba-Nacos
1.nacos产生背景在微服务通讯时,服务与服务之间的依赖非常大,每个服务的url管理地址较为复杂。所以采用服务治理技术来实现对整个服务的动态注册与发现,本地负载,容错等。2.注册中心作用管理服务的url地址3.注册中心有哪些dubbo依赖zookeepereurekaconsulernacos4.nacos基本介绍实现注册中心和分布式配置中心默认端口号88485.负载均衡算法hash一致性轮询权
1.nacos产生背景
在微服务通讯时,服务与服务之间的依赖非常大,每个服务的url管理地址较为复杂。所以采用服务治理技术来实现对整个服务的动态注册与发现,本地负载,容错等。
2.注册中心作用
管理服务的url地址
3.注册中心有哪些
dubbo依赖zookeeper
eureka
consuler
nacos
4.nacos基本介绍
实现注册中心和分布式配置中心
默认端口号8848
5.负载均衡算法
hash一致性
轮询
权重
随机
6.CAP概念
C:一致性:在分布式系统中,服务器集群情况下,每个节点同一时刻查询的数据必须保持一致
A:可用性:在分布式系统中,服务器集群情况下,部分节点出现故障后仍然可以继续访问
P:分区容错性:在分布式系统中,网络波动是无法避免的
7.eureka与zookeeper、nacos注册中心区别
zookeeper采用CP保证数据一致性问题。出现宕机的情况下会重新选举。在选举的过程中会出现短暂的无法使用
eureka采用AP。去中心化思想
nacos支持两种模式,CP和AP 默认是AP模式
8.什么是中心化和去中心化
中心化:必须围绕一个领导角色为核心
去中心化:每个角色都是均等的
9.启动nacos服务
1)nacos下载地址
链接:https://pan.baidu.com/s/1jhUs3HDvZ2nOS98betJhHA
提取码:ho6a
2)启动nacos
3)访问naocs
账号:nacos
密码:nacos
10.搭建生产者
链接:https://pan.baidu.com/s/14uBv9WRh_LaS2wbSFO-Icw
提取码:2f8k
1)pom依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.11.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!-- springboot 整合web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
</dependencies>
2.yml配置
spring:
application:
###服务的名称
name: nacos-member
cloud:
nacos:
discovery:
###nacos注册地址
server-addr: 127.0.0.1:8848
server:
port: 8081
3)定义接口
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class MemberService {
@Value("${server.port}")
private String serverPort;
/**
* 会员服务提供的接口被订单服务调用
* @return
*/
@GetMapping("/getUser")
public String getUser() {
return "会员服务,端口号为:" + serverPort;
}
}
4)启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class AppMember {
public static void main(String[] args) {
SpringApplication.run(AppMember.class);
}
}
5)测试
http://localhost:8080/getUser?userId=1
8.消费者搭建
链接:https://pan.baidu.com/s/1r08dwg_b3uxfeT3pZ8ucHQ
提取码:wnfz
1)pom依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.11.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<!-- springboot 整合web组件-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-nacos-discovery</artifactId>
<version>2.1.1.RELEASE</version>
</dependency>
</dependencies>
2)yml配置
spring:
application:
###服务的名称
name: nacos-order
cloud:
nacos:
discovery:
###nacos注册地址
server-addr: 127.0.0.1:8848
server:
port: 8090
3)消费者
import com.demo.loadbalancer.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.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import java.net.URI;
import java.util.List;
@RestController
public class OrderService {
@Autowired
private DiscoveryClient discoveryClient;
@Autowired
private RestTemplate restTemplate;
@Autowired
private LoadBalancer loadBalancer;
/**
* 订单服务调用到我们的会员服务接口
* @return
*/
@RequestMapping("/orderToMember")
public Object orderToMember() {
// 1.根据服务名称从 注册中心获取集群列表地址
List<ServiceInstance> instances = discoveryClient.getInstances("nacos-member");
// 2.列表任意选择一个 实现本地rpc调用 rest 采用我们负载均衡的算法
ServiceInstance srviceInstance = loadBalancer.getSingleAddres(instances);
URI rpcMemberUrl = srviceInstance.getUri();
String result = restTemplate.getForObject(rpcMemberUrl + "/getUser", String.class);
return "订单调用会员返回结果:" + result;
}
}
4)负载均衡接口
import org.springframework.cloud.client.ServiceInstance;
import java.util.List;
/**
* 负载均衡算法接口
*/
public interface LoadBalancer {
/**
* 从注册中心集群列表中获取单个地址
* @param serviceInstances
* @return
*/
ServiceInstance getSingleAddres(List<ServiceInstance> serviceInstances);
}
5)负载均衡轮询实现
import org.springframework.cloud.client.ServiceInstance;
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 getSingleAddres(List<ServiceInstance> serviceInstances) {
int index = atomicInteger.incrementAndGet() % serviceInstances.size();
return serviceInstances.get(index);
}
}
6)启动类
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 AppOrder {
public static void main(String[] args) {
SpringApplication.run(AppOrder.class);
}
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
7)测试
更多推荐
所有评论(0)