【Spring全家桶系列超全整理之SpringBoot框架】12 SpringBoot与分布式

本文详细介绍了如何在SpringBoot中集成Dubbo和Zookeeper实现服务的提供与消费,以及对比了SpringBoot与SpringCloud在注册中心Eureka上的应用。通过实例展示了服务的发布、消费、注册与发现过程。
摘要由CSDN通过智能技术生成

本文介绍SpringBoot相关内容。和【跨考菌】一起加油吧~

在这里插入图片描述

如果你有收获,记得帮博主一键三连哦😊


1 分布式应用概述

在这里插入图片描述
在这里插入图片描述

2 Zookeeper和dubbo

2.1 概述

在这里插入图片描述
在这里插入图片描述
dubbo参考:https://github.com/alibaba/dubbo

2.2 安装zookpper

拉取zk镜像:

docker pull zookeeper

查看镜像:

[root@kafka2 ~]# docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
docker.io/rabbitmq             3-management        800294d91e31        3 weeks ago         198 MB
docker.io/zookeeper            latest              28ffb774bc32        3 weeks ago         253 MB
jpress                         latest              773e1fd1b1b9        2 months ago        313 MB
nginx                          v3                  89f9edd3eb63        2 months ago        133 MB
<none>                         <none>              afebc12a7cbe        2 months ago        72.9 MB
docker.io/mysql                latest              4f1413420360        2 months ago        545 MB
docker.io/elasticsearch        latest              5acf0e8da90b        2 years ago         486 MB
docker.io/elasticsearch        2.4.6               5e9d896dc62c        2 years ago         479 MB
hub.c.163.com/library/tomcat   latest              72d2be374029        3 years ago         292 MB
hub.c.163.com/library/nginx    latest              46102226f2fd        3 years ago         109 MB

启动zk容器:

docker run --name zk01 -p 2181:2181 --restart always -d zookeeper

开放端口:

firewall-cmd --zone=public --add-port=2181/tcp --permanent
firewall-cmd --reload

2.3 provider端

2.3.1 引入dubbo和zkclient相关依赖

<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>

2.3.2 配置dubbo的扫描包和注册中心地址

application.properities:

dubbo.application.name=provider-ticket # 配置服务名

dubbo.registry.address=zookeeper://192.168.229.142:2181 # 配置zk的地址

dubbo.scan.base-packages=com.atguigu.ticket.service # 配置dubbo的扫描包路径

2.3.3 使用@Service发布服务

public interface TicketService {

    public String getTicket();
}
import com.alibaba.dubbo.config.annotation.Service;
import org.springframework.stereotype.Component;


@Component
@Service //将服务发布出去
public class TicketServiceImpl implements TicketService {
    @Override
    public String getTicket() {
        return "《厉害了,我的国》";
    }
}

切记,这里的@Servicedubbo的注解,不是spring的注解,很容易混淆的。

2.4 consumer端

2.4.1 引入依赖

<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>

2.4.2 配置dubbo的注册中心地址

dubbo.application.name=consumer-user

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

2.4.3 引用服务

引入rpc调用的接口定义:

public interface TicketService {

    public String getTicket();
}

调用:

import com.alibaba.dubbo.config.annotation.Reference;
import com.atguigu.ticket.service.TicketService;
import org.springframework.stereotype.Service;

@Service // dubbo的注解
public class UserService{

    @Reference // 引用rpc的service
    TicketService ticketService; 

    public void hello(){
        String ticket = ticketService.getTicket();
        System.out.println("买到票了:"+ticket);
    }
}

3 spring boot和spring cloud

在这里插入图片描述

3.1 注册中心

引入依赖:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

在这里插入图片描述
启动类标注@EnableEurekaServer注解:

/**
 * 注册中心
 * 1、配置Eureka信息
 * 2、@EnableEurekaServer
 */
@EnableEurekaServer
@SpringBootApplication
public class EurekaServerApplication {

配置application.yml:

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

3.2 provider端

3.2.1 引入依赖:

<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

3.2.2 配置application.yml

server:
  port: 8001
spring:
  application:
    name: provider-ticket


eureka:
  instance:
    prefer-ip-address: true # 注册服务的时候使用服务的ip地址
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/

3.2.3 暴露服务

import org.springframework.stereotype.Service;

@Service
public class TicketService {

    public String getTicket(){
        System.out.println("8001");
        return "《厉害了,我的国》";
    }
}

3.3 consumer端

3.3.1 引入依赖;

<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>

3.3.2 开启服务发现功能并注入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.3.3 远程调用

@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;
    }
}

其中的PROVIDER-TICKET可以在注册中心看到(见下图),自动按照负载均衡调用服务。在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值