springcloud consul注册中心

consul服务注册中心

简介:consul基于go语言进行开发服务注册中心,轻量级服务注册中心 google 作用:管理微服务中所有服务注册 发现
管理服务元数据信息存储(服务名 地址列表) 心跳健康检查

consul服务注册中心安装 a.安装consul b.在指定目录进行解压缩(注意:不建议目录中含有中文)
c.查看consul环境变量是否配置成功 consul -v c.启动consul服务注册中心 在consul安装目录中打开cmd
consul agent -dev 建议配置环境变量 d.访问consul管理界面 http://localhost:8500
consul默认端口是8500 consul简介:
consul是一个可以提供服务发现,健康检查,多数据中心,key/value存储等功能的分布式服务架构,用于实现
分布式系统的服务发现与配置,与其他分布式服务注册与发现的方案,使用起来比较简单。consul用golang实现,
因此具有天然可移植性(支持Linux、windows和Mac os x);安装包仅包含一个可执行文件,方便部署。

consul管理界面基本介绍(访问地址http://localhost:8500/)
1.dc1:数据中心名称 datacenter 默认为dc1
指定数据库中心启动consul agent -dev -datacenter=aa
2.services:当前consul服务中注册服务列表 默认:client server同时启动自己注册自己,会出现一个consul服务
3.nodes:用来查看consul集群节点
-----------------------------------------------------------------------------------------

consul client服务客户端(微服务)

1.先创建springcloud的父项目,在它基础上再创建以下模块
2.创建独立springboot应用
3.引入依赖


    org.springframework.cloud
    spring-cloud-starter-consul-discovery
    2.2.6.RELEASE

4.编写application.properties

server.port=8081

#指定服务名称
spring.application.name=CONSULCLIENT

#想注册中心consul server服务注册地址
spring.cloud.consul.host=localhost
spring.cloud.consul.port=8500
#spring.cloud.consul.discovery.service-name=${spring.application.name}  默认是spring.application.name为主的
spring.cloud.consul.discovery.service-name=aa

5.在入口类上加入注解
@SpringBootApplication
@EnableDiscoveryClient //作用:通用服务注册客户端注解 代表 public class ConsulClientApplication {}

6.直接启动consul client红色 原因:consul sever检测所有客户端心跳,但是发送心跳时client必须给予响应才能该服务才能正常使用
在现有客户端中我们并没有引入健康检查依赖,所有导致健康检查始终不同通过,导致服务不能正常使用
spring.cloud.consul.discovery.register-health-check=false 关闭健康检查
在生产中不建议关闭


    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-actuatorartifactId>
    dependency>

7.注意: a.以上的依赖和启动准备之前需要让consul注册中心的服务打开,不然无法访问 b.打开之后,可以通过http://localhost:8500访问ui页面

微服务之间如何通信

1.什么是微服务 定义:基于单体应用围绕业务进行服务拆分,拆分出来每一个服务独立应用 独立执行 独立部署 运行在自己计算机进程中 基于分布式服务管理
2.如何解决服务的服务间通信问题? a. HTTP Rest方式 使用http协议进行数据传递 JSON springcloud使用HTTP协议传递数据 b. RPC 方式 远程过程调用 二进制
OSI:物理层 数据链路层 网络层 传输层(RPC) 会话层 表现层 应用层(Http)
3.如何在java代码中发起http方式请求? a. spring框架提供HttpClient对象 RestTemplate 发起一个http请求
4.实现服务间通信写一个案例
1.开发两个测试服务 用户服务 users 订单服务 orders
2.用户服务 订单服务 都是两个独立springboot应用
3.两个服务都引入consul client依赖 和 健康检查依赖

 
    <dependency>
        <groupId>org.springframework.cloudgroupId>
        <artifactId>spring-cloud-starter-consul-discoveryartifactId>
        <version>2.2.6.RELEASEversion>
    dependency>
    
    <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-actuatorartifactId>
    dependency>
4.配置两个服务application.properties
server.port=9999

		#指定服务名称
		spring.application.name=ORDERS

		#想注册中心consul server服务注册地址
		spring.cloud.consul.host=localhost
		spring.cloud.consul.port=8500

5.在controller中使用RestTemplate来调用模板

@RestController
@Slf4j
public class OrdersController {

    @RequestMapping(value = "/orders")
    public String test(){
        log.info("准备访问users");
        RestTemplate template = new RestTemplate();
        String forObject = template.getForObject("http://127.0.0.1:8888/users", String.class);
        log.info("访问users成功");
        return forObject;
    }
}

ResTemplate方式通信存在问题

1.现有ResTemplate方式通信存在问题?
2.现在RestTemplate在进行服务间通信时? a.调用服务的路径主机和服务端口直接写死在url中无法实现服务集群时请求负载均衡 b.调用服务的请求路径写死在代码中,日后提供服务,服务路径发生变化时不利于后续维护工作
3.解决RestTemplate负载均衡问题?
a.使用列表存储的端口号并随机生成端口出现了以下问题
(1).无法实现服务健康检查
(2).负载均衡策略过于单一(随机)
b.使用springcloud提供组件ribbon解决负载均衡调用(推荐使用)
4.Ribbon springcloud-netflix-fibbon 作用:负载均衡客户端组件 就是用来实现请求调用时负载均衡

5.Ribbon负载均衡原理
springcloud consul注册中心_第1张图片
在使用Ribbon负载均衡时,客户端会去注册中心找到需要的端口,并将端口加载到客户端缓存,所以Ribbon属于客户端的负载均衡(面试题),当再次访问时,回去缓存中找该负载均衡,若有一个端口断开,会出现(1.访问不到2.当一个节点断开时,concul注册中心会有心跳,根据心跳更新客户端中Ribbon的缓存)

6.使用Ribbon+ResTtmplate实现请求负载均衡 a.使用用户调用订单服务 用户服务中引入ribbon依赖 (注意:在consul client依赖中已经存在ribbon相关依赖无需项目中显示引入)

使用Ribbon组件实现负载均衡调用

1.在服务中引入Ribbon依赖 注意:consul client 客户端依赖中已经包含Ribbon

2.直接使用Ribbon组件根据服务id实现请求负载均衡
a. DiscoveryClient 服务发现客户端对象 根据服务id去服务注册中心获取对应服务列表到本地中

   //2.使用ribbon组件+RestTemplate实现负载均衡调用  1.DiscoveryClient  2.LoadBalanceClient @LoadBalance
        //2.1DiscoveryClient
        List<ServiceInstance> users = discoveryClient.getInstances("USERS");
        users.forEach(user -> {
            log.info("服务主机:"+user.getHost()+",服务端口"+user.getPort()+",服务地址:"+user.getUri());
        });

        String forObject = new RestTemplate().getForObject(users.get(0).getUri() + "/users", String.class);
        return forObject;

缺点:没有负载均衡 需要自己实现负载均衡

b .LoadBalanceClient 负载均衡客户端对象
根据服务id去服务注册中心获取对应服务列表,根据默认负载均衡策略选择列表中一台机器 进行返回

//        2.2使用LoadBalanceClient进行服务调用(默认轮询)
        ServiceInstance user = loadBalancerClient.choose("USERS");
        log.info("服务主机:"+user.getHost()+",服务端口"+user.getPort()+",服务地址:"+user.getUri());
        String forObject = new RestTemplate().getForObject(user.getUri() + "/users", String.class);
        return forObject;

缺点:使用时需要每次先根据服务id获取一个负载均衡机器之后再通过restTemplate调用服务

c.@LoadBalance + RestTemplate 负载均衡客户端注解 修饰范围:用在方法上 作用:让当前方法 当前对象具有Ribbon负载均衡特性

  //工厂中创建RestTemplate
    @LoadBalanced
    @Bean
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }
//        2.3使用@LoadBalance完成负载均衡
        //2.3.1由于使用RestTemplate每次都需要创建,所以直接使用配置类,创建bean对象,放到容器中,并在bean对象上放置@LoadBalance注解即可
    String forObject = restTemplate.getForObject("http://USERS/users", String.class);
        return forObject;

3.使用RestTemplate + Ribbon 这种完成服务间通信 a.路径写死再代码中不利于维护 restTemplate.getForObject(“http://USERS/users”, String.class);

你可能感兴趣的:(springcloud consul注册中心)