SpringBoot 分布式理解 热部署理解监控管理 20190305

分布式理解

  1. 模块存在不存在需要有人知道 我去调用哪个模块 需要有人知道,这个时候就需要注册中心的存在了 注册中心保存了所有模块信息 你调用的时候会帮你选择去调用哪个 zookeeper
  2. 模块之间的互相调用RPC 远程过程调用 dubbo , Spring Cloud
  3. docker 安装zookeeper
docker pull zookeeper
docker run  --name  zk01 -p 2181:2181  --restart always -d  zookeeper 
#查看 docker ps

  1. 引入相关包 zkclient dubbo
<dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>0.1.0</version></dependency><!--引入zookeeper的客户端工具--><!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient --><dependency><groupId>com.github.sgroschupf</groupId><artifactId>zkclient</artifactId><version>0.1</version></dependency>

  1. 配置文件
dubbo.application.name=provider-ticket #应用名字

dubbo.registry.address=zookeeper://192.168.2.118:2181 #zookeeper地址

dubbo.scan.base-packages=com.test.ticket.service #扫描需要注册的包

3)类上加注解

@Component@Service //将服务发布出去 import com.alibaba.dubbo.config.annotation.Service;public class TicketServiceImpl implements TicketService {@Overridepublic String getTicket() {return "《厉害了,我的国》";}}

  1. 消费
    1)引入依赖
    2)配置文件
dubbo.application.name=consumer-user

dubbo.registry.address=zookeeper://192.168.2.118:2181

3)需要创建与生产者一样的接口(包路径也要一样)

4)远程引用 他是用全类名进行匹配的

@ReferenceTicketService ticketService;

  1. Spring Cloud
    dubbo 主要解决服务之间远程获取调用 RPC
    Spring Cloud 是个整体解决方案 配合管理 服务发现 熔断 路由 控制中线 等
    只要是分布式中存在的问题 Spring Cloud 基本都有解决方

    在这里插入图片描述


    服务发现就是zookeeper类似
    客户端负载均衡就是dubbo类似
    断路器就是几次调用失败后不等得 快速返回失败
    服务网关 过滤请求 调用之前先过服务网关
    分布式配置 服务之间的配置

  2. Spring Cloud使用
    Server:
    1)引入包Eureka Server
    2)简单配置

server:
  port: 8761eureka:
  instance:hostname: eureka-server  # eureka实例的主机名
  client:register-with-eureka: false #不把自己注册到eureka上fetch-registry: false #不从eureka上来获取服务的注册信息service-url:  defaultZone: http://localhost:8761/eureka/

3)注解@EnableEurekaServer

@EnableEurekaServer@SpringBootApplicationpublic class EurekaServerApplication {public static void main(String[] args) {
		SpringApplication.run(EurekaServerApplication.class, args);}}

4)启动 直接能访问 localhost:8761

  1. 服务提供者
  1. 引入 Eureka discovery
    2)编写服务
@Servicepublic class TicketService {public String getTicket(){System.out.println("8002");return "《厉害了,我的国》";}}@RestControllerpublic class TicketController {@AutowiredTicketService ticketService;@GetMapping("/ticket")public String getTicket(){return ticketService.getTicket();}}

3)配置文件

server:
  port: 8002spring:
  application:name: provider-ticketeureka:
  instance:prefer-ip-address: true # 注册服务的时候使用服务的ip地址
  client:service-url:  defaultZone: http://localhost:8761/eureka/

  1. 服务消费者
  1. 引入 Eureka discovery
    2)配置文件
spring:
  application:name: consumer-userserver:
  port: 8200eureka:
  instance:prefer-ip-address: true # 注册服务的时候使用服务的ip地址
  client:service-url:  defaultZone: http://localhost:8761/eureka/

3)注解开启 发现服务

@EnablediscoveryClient //开启发现服务功能@SpringBootApplicationpublic class ConsumerUserApplication {public static void main(String[] args) {
		SpringApplication.run(ConsumerUserApplication.class, args);}@LoadBalanced //使用负载均衡机制 会请求不同的服务实例(每个服务会部署多套 防止服务死掉 影响调用端)@Bean //它帮我们发送http请求public RestTemplate restTemplate(){return new RestTemplate();}}

4)测试

@RestControllerpublic class UserController {@AutowiredRestTemplate restTemplate;/**
	*PROVIDER-TICKET  Server中注册进来的服务名(可能有多个服务 负载均衡的时候就会访问不同的服务) 访问localhost:8761就可以看到的
	*/@GetMapping("/buy")public String buyTicket(String name){String s = restTemplate.getForObject("http://PROVIDER-TICKET/ticket", String.class);return name+"购买了"+s;}}

热部署理解

  1. Spring loaded
  2. JRebel 热部署插件 收费的
  3. Spring Boot Devtools
    SpringBoot使用的是 devtools idea中是ctrl+f9 eclipse中是ctrl+s直接保存就已经部署了

监控管理

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>

  1. 启动 控制台就会看到好多路径 那就是监控信息的访问地址
  2. 没有权限访问 需要修改配置文件 重启
management.security.enabled=false

  1. 直接访问127.0.0.1/8080/xxx

  2. 在这里插入图片描述

  3. 定制端点
    endpoints.beans.id=mybean 就是把beans换为mybean
    定制路径:endpoints.beans.path=/testbean 只能访问/testbean有效 其他/mybean /beans都无效

  4. 开启和关闭
    endpoints.端点.enabled=false

  5. 关闭所有的端点 启动一两个
    endpoints.enabled=false //关闭所有
    endpoints.端点A.enabled=true //开启端点A

  6. 定制所有端点的访问根路径
    management.context-path=/manage
    /manage/端点 访问
    好处就是可以结合以后的springsrcurity 权限 针对/manage进行权限控制

  7. 定义manage端点的端口号
    management.port=8181
    访问的时候 就不是项目端口了 需要使用8181
    如果写:
    management.port=-1 就是把管理端点禁止掉了

  8. 自定义Healthindicator
    它本身监控很多控件,前提是控件的starter被引入项目中

/**
 * 自定义健康状态指示器
 * 1、编写一个指示器 实现 Healthindicator 接口
 * 2、指示器的名字 xxxxHealthindicator
 * 3、加入容器中
 */
 @Componentpublic class MyAppHealthindicator implements Healthindicator {@Overridepublic Health health() {//自定义的检查方法//Health.up().build()代表健康return Health.down().withDetail("msg","服务异常").build();}}

相关文章

在网络请求时,总会有各种异常情况出现,我们需要提前处理这...
作者:宇曾背景软件技术的发展历史,从单体的应用,逐渐演进...
hello,大家好呀,我是小楼。最近一个技术群有同学at我,问我...
 一个软件开发人员,工作到了一定的年限(一般是3、4年左右...
当一个服务调用另一个远程服务出现错误时的外观Dubbo提供了多...
最近在看阿里开源RPC框架Dubbo的源码,顺带梳理了一下其中用...