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. 《Clojure编程》笔记 第5章 宏

    目录 背景简述 第5章 宏 5.0 术语 5.1 宏到底是什么 5.1.1 宏不是什么 5.1.2 有什么是宏能做而函数不能做的 5.1.3 宏vsRuby的eval 5.2 编写你的第一个宏 5.3 ...

  2. (C#2,.net framework2.0,Visual Studio 2003)之前版本

    (C#2,.net framework2.0,Visual Studio 2003)之前版本归为最初的版本(主要是针对.net framework),其主要定义了最基本的类型.特性. 1.基本的类型 ...

  3. Docker(12)- docker run 命令详解

    如果你还想从头学起 Docker,可以看看这个系列的文章哦! https://www.cnblogs.com/poloyy/category/1870863.html 作用 创建一个新的容器并运行一个 ...

  4. CF777E Hanoi Factory

    DP单调栈优化 看到这道题可以很自然的想到DP 设$dp[i]$表示最后一个$ring$为$i$的最大高度 首先将$b$为第一关键字,$a$为第二关键字,升序排序元素 那么对于$i$来说,它下面的$r ...

  5. 【SpringBoot】02.编写HelloWorld

    1.编写一个返回HelloWorld的Controller @Controller public class HelloWorld { @ResponseBody @RequestMapping(&q ...

  6. php之策略模式

    策略模式:封装算法,选择所用具体实现的置业由客户对象承担. 将算法具体类,然后互相替换,不影响客户. <?php /** * 设计模式之策略模式 * User: 小狗蛋儿 * Date: 201 ...

  7. git clone 出现"error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with unexpected length was received."

    1. 最近用git pull几个大项目,总是报如下错误: error: RPC failed; curl 56 GnuTLS recv error (-9): A TLS packet with un ...

  8. Javascript的运行效率是原生代码的20%-30%

    所以jser们,写代码更仔细些吧. http://www.cnblogs.com/codemood/p/3213459.html

  9. tcpack--3快速确认模式- ack状态发送&清除

    ACK发送状态的转换图 ACK的发送状态清除 当成功发送ACK时,会删除延迟确认定时器,同时清零ACK的发送状态标志icsk->icsk_ack.pending ACK发送事件主要做了:更新快速 ...

  10. Adaboost算法的一个简单实现——基于《统计学习方法(李航)》第八章

    最近阅读了李航的<统计学习方法(第二版)>,对AdaBoost算法进行了学习. 在第八章的8.1.3小节中,举了一个具体的算法计算实例.美中不足的是书上只给出了数值解,这里用代码将它实现一 ...