1.分布式简介 

2.Zookeeper和Dubbo 

3.zookeeper

(1).zookeeper安装

官方文档:https://hub.docker.com/_/zookeeper?tab=description

在docker上安装zookeeper

[root@hosystem ~]# docker search zookeeper

NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED

zookeeper                          Apache ZooKeeper is an open-source server wh…   947                 [OK]

[root@hosystem ~]# docker pull zookeeper:3.4.11

(2).zookeeper启动

[root@hosystem ~]# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

zookeeper           3.4.11              56d414270ae3        2 years ago         146MB

[root@hosystem ~]# docker run --name ZK01 -p 2181:2181 --restart always -d 56d414270ae3

054d27805228d7d3cc6f8df96962a2dd9c24f3f5907554160854c661ef8d67dd

[root@hosystem ~]# docker ps

CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                                                                                                         NAMES

054d27805228        56d414270ae3            "/docker-entrypoint.…"   41 seconds ago      Up 21 seconds       2888/tcp, 0.0.0.0:2181->2181/tcp, 3888/tcp                                                                    ZK01

#将2181端口添加到防火墙

[root@hosystem ~]# firewall-cmd --permanent --zone=public --add-port=2181/tcp

success

[root@hosystem ~]# firewall-cmd --reload

success

(3).zookeeper整合dubbo

[1].创建项目

①.创建Empty Project

②.New Module

创建provider

创建consumer

4.Spring Boot和Spring Cloud

Martin Fowler 微服务原文 https://martinfowler.com/articles/microservices.html 

(1).创建工程

[1].创建Empty Project

[2].创建eureka-server

[3].创建provider-ticket

[4].创建consumer-user

(2).配置eureka-server信息

[1].application.properties

server.port=8761

eureka.instance.hostname=eureka-server

eureka.client.register-with-eureka=false

eureka.client.fetch-registry=false

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

[2].EurekaServerApplication.java

package com.hosystem.eurekaserver;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**

 *     注册中心

 *     1.配置Eureka信息

 *     2.@EnableEurekaServer

 */

@EnableEurekaServer

@SpringBootApplication

public class EurekaServerApplication {

public static void main(String[] args) {

SpringApplication.run(EurekaServerApplication.class, args);

}

}

访问eureka页面

(3).配置provider-ticket信息

[1].8001

①.TicketController.java

package com.hosystem.providerticket.controller;

import com.hosystem.providerticket.service.TicketService;

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

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

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

@RestController

public class TicketController {

@Autowired

TicketService ticketService;

@GetMapping("/ticket")

public String getTicket(){

System.out.println("8001");

return ticketService.getTicket();

}

}

②.TicketService.java

package com.hosystem.providerticket.service;

import org.springframework.stereotype.Service;

@Service

public class TicketService {

public String getTicket(){

return "《模仿游戏》";

}

}

③.application.properties

server.port=8001

spring.application.name=provider-ticket

#注册服务的时候使用服务的ip地址

eureka.instance.prefer-ip-address=true

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

[2].8002

①.TicketController.java

package com.hosystem.providerticket.controller;

import com.hosystem.providerticket.service.TicketService;

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

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

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

@RestController

public class TicketController {

@Autowired

TicketService ticketService;

@GetMapping("/ticket")

public String getTicket(){

System.out.println("8002");

return ticketService.getTicket();

}

}

②.TicketService.java

package com.hosystem.providerticket.service;

import org.springframework.stereotype.Service;

@Service

public class TicketService {

public String getTicket(){

return "《模仿游戏》";

}

}

③.application.properties

server.port=8002

spring.application.name=provider-ticket

#注册服务的时候使用服务的ip地址

eureka.instance.prefer-ip-address=true

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

(4).provider-ticket

[1].package

打包provider-ticket两次,一个端口为8001一次端口为8002

[2].启动provider

(5).consumer-user

[1]application.properties

server.port=8200

spring.application.name=consumer-user

#注册服务的时候使用服务的ip地址

eureka.instance.prefer-ip-address=true

eureka.client.service-url.defaultZone=http://localhost:8761/eureka/

[2].ConsumerUserApplication.java

package com.hosystem.consumeruser;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

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

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

import org.springframework.context.annotation.Bean;

import org.springframework.web.client.RestTemplate;

@EnableDiscoveryClient //开启发现功能

@SpringBootApplication

public class ConsumerUserApplication {

public static void main(String[] args) {

SpringApplication.run(ConsumerUserApplication.class, args);

}

@LoadBalanced  //使用负载均衡机制

   @Bean

public RestTemplate restTemplate(){

return new RestTemplate();

}

}

[3].UserController.java

package com.hosystem.consumeruser.controller;

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

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

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

import org.springframework.web.client.RestTemplate;

@RestController

public class UserController {

@Autowired

RestTemplate restTemplate;

@GetMapping("/buy")

public String buyTicket(String name){

String s =  restTemplate.getForObject("http://PROVIDER-TICKET/ticket",String.class);

return name+"观看了"+s;

}

}

注意,观察加@LoadBalanced和不加@LoadBalanced的区别。加了@LoadBalanced的可以实现负载均衡。

参考文档:

https://github.com/alibaba/dubbo

https://hub.docker.com/_/zookeeper?tab=description

https://github.com/apache/dubbo/

https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient

https://martinfowler.com/articles/microservices.html

10、Spring Boot分布式的更多相关文章

  1. spring boot分布式技术,spring cloud,负载均衡,配置管理器

    spring boot分布式的实现,使用spring cloud技术. 下边是我理解的spring cloud的核心技术: 1.配置服务器 2.注册发现服务器eureka(spring boot默认使 ...

  2. spring boot 分布式session实现

    spring boot 分布式session实现 主要是通过包装HttpServletRequest将session相关的方法进行代理. 具体是的实现就是通过SessionRepositoryFilt ...

  3. 2020最新的Spring Boot 分布式锁的具体实现(内附代码)

    前言 面试总是会被问到有没有用过分布式锁.redis 锁,大部分读者平时很少接触到,所以只能很无奈的回答 "没有".本文通过 Spring Boot 整合 redisson 来实现 ...

  4. spring boot 分布式事务实现(XA方式)

    关于spring boot 支持分布式事务,XA是常用的一种方式. 这里把相关的配置记下,方便以后使用. 首先配置两个不同的数据源 : 订单库.持仓库. /** * Created by zhangj ...

  5. spring boot 分布式锁组件 spring-boot-klock-starter

    基于redis的分布式锁spring-boot starter组件,使得项目拥有分布式锁能力变得异常简单,支持spring boot,和spirng mvc等spring相关项目 快速开始 sprin ...

  6. Spring Boot 分布式Session状态保存Redis

    在使用spring boot做负载均衡的时候,多个app之间的session要保持一致,这样负载到不同的app时候,在一个app登录之后,而打到另外一台服务器的时候,session丢失. 常规的解决方 ...

  7. 【spring boot】10.spring boot下的单元测试

    spring boot下的单元测试,思前想后还是需要单独用一章篇幅来看看. 然后在看了介绍和使用时候,我感觉并不想多去看了. 但是还是给后来人留下参考的路径: 官网说明:https://spring. ...

  8. (38)Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】

    [本文章是否对你有用以及是否有好的建议,请留言] 在使用spring boot做负载均衡的时候,多个app之间的session要保持一致,这样负载到不同的app时候,在一个app登录之后,而访问到另外 ...

  9. 使用idea maven开发spring boot 分布式开发入门

    1:使用idea创建一个maven工程 bos2 2:删除bos2的src 文件夹,向pom.xml文件 中添加版本号 <packaging>pom</packaging> & ...

随机推荐

  1. MongoDB复制 --- MongoDB基础用法(五)

    复制 MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允许您从硬件故障和服务中断中恢复 ...

  2. 【转】Extension Libraries and Loading Other Image Formats

    FROM: http://lazyfoo.net/tutorials/SDL/06_extension_libraries_and_loading_other_image_formats/index. ...

  3. python实现密码破解

    排列组合(破解密码) 关注公众号"轻松学编程"了解更多. 1.排列 itertools.permutations(iterable,n) 参数一:要排列的序列, 参数二:要选取的个 ...

  4. ERP的财务凭证的操作与设计--开源软件诞生23

    赤龙ERP财务凭证讲解--第23篇 用日志记录"开源软件"的诞生 [进入地址 点亮星星]----祈盼着一个鼓励 博主开源地址: 码云:https://gitee.com/redra ...

  5. 面经手册 · 第16篇《码农会锁,ReentrantLock之公平锁讲解和实现》

    作者:小傅哥 博客:https://bugstack.cn 专题:面经手册 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 Java学多少才能找到工作? 最近经常有小伙伴问我,以为我的经验来看 ...

  6. 【CF1443F】Identify the Operations 题解

    原题链接 题意简介 建议去原题看.这题意我表达不清楚. 大概就是给你一个 n 的排列,现在要求你进行 m 次操作. 每次操作,你会在现有的排列中删去一个数,然后选择其左边或右边的一个与之相邻的数加入 ...

  7. Docker(11)- docker ps 命令详解

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 列出容器 语法格式 doc ...

  8. .NET EF实现NoLock

    sql实现方法:  select * from 表名(nolock)            加上(nolock)    EF实现办法:    程序集引用    System.Transactions  ...

  9. 内网渗透 day14-empire基础命令的使用

    empire的基础操作 目录 1. 建立监听器 2. 设置stagers 3. 用户交互 4. 提权 1. 建立监听器 help    查看帮助命令 listeners     查看监听器 useli ...

  10. 经典c程序100例==31--40

    [程序31] 题目:请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续 判断第二个字母. 1.程序分析:用情况语句比较好,如果第一个字母一样,则判断用情况语句或if语句判断第二个字 ...