分布式理解
- 模块存在不存在需要有人知道 我去调用哪个模块 需要有人知道,这个时候就需要注册中心的存在了 注册中心保存了所有模块信息 你调用的时候会帮你选择去调用哪个 zookeeper
- 模块之间的互相调用RPC 远程过程调用 dubbo , Spring Cloud
- docker 安装zookeeper
docker pull zookeeper docker run --name zk01 -p 2181:2181 --restart always -d zookeeper #查看 docker ps
- 引入相关包 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>
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)引入依赖
2)配置文件
dubbo.application.name=consumer-user dubbo.registry.address=zookeeper://192.168.2.118:2181
3)需要创建与生产者一样的接口(包路径也要一样)
4)远程引用 他是用全类名进行匹配的
@ReferenceTicketService ticketService;
Spring Cloud
dubbo 主要解决服务之间远程获取调用 RPC
Spring Cloud 是个整体解决方案 配合管理 服务发现 熔断 路由 控制中线 等
只要是分布式中存在的问题 Spring Cloud 基本都有解决方案
服务发现就是zookeeper类似
客户端负载均衡就是dubbo类似
断路器就是几次调用失败后不等得 快速返回失败
服务网关 过滤请求 调用之前先过服务网关
分布式配置 服务之间的配置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
- 服务提供者
- 引入 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/
- 服务消费者
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;}}
热部署理解
- Spring loaded
- JRebel 热部署插件 收费的
- Spring Boot Devtools
SpringBoot使用的是 devtools idea中是ctrl+f9 eclipse中是ctrl+s直接保存就已经部署了
监控管理
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency>
management.security.enabled=false
直接访问127.0.0.1/8080/xxx
定制端点
endpoints.beans.id=mybean 就是把beans换为mybean
定制路径:endpoints.beans.path=/testbean 只能访问/testbean有效 其他/mybean /beans都无效开启和关闭
endpoints.端点.enabled=false关闭所有的端点 启动一两个
endpoints.enabled=false //关闭所有
endpoints.端点A.enabled=true //开启端点A定制所有端点的访问根路径
management.context-path=/manage
/manage/端点 访问
好处就是可以结合以后的springsrcurity 权限 针对/manage进行权限控制定义manage端点的端口号
management.port=8181
访问的时候 就不是项目端口了 需要使用8181
如果写:
management.port=-1 就是把管理端点禁止掉了
/** * 自定义健康状态指示器 * 1、编写一个指示器 实现 Healthindicator 接口 * 2、指示器的名字 xxxxHealthindicator * 3、加入容器中 */ @Componentpublic class MyAppHealthindicator implements Healthindicator {@Overridepublic Health health() {//自定义的检查方法//Health.up().build()代表健康return Health.down().withDetail("msg","服务异常").build();}}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。