利用Eureka 搭建一个简单的分布式架构

😏DEMO我放在git上。

https://github.com/HongXiangg/Cloud-Api
https://github.com/HongXiangg/Cloud-EurekaServer
https://github.com/HongXiangg/Cloud-Cloud-Provider
https://github.com/HongXiangg/Cloud-Cloud-Consumer

😏先了解Eureka

	寄几百度🤨

😏工程架构

工程架构
五个工程。一个父工程,四个子模块。

😏一.Cloud-Parent (父工程 parent)

1.创建一个maven simple 的工程

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
simple的工程默认会用jdk1.5,eureka最低支持1.8,所以可以修改工程的「.seetings/org.eclipse.jdt.core.prefs」文件 把里面的1.5 -->1.8 (没有问题请忽略)

2.添加pom依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.hongxiang</groupId>
  <artifactId>Cloud-Parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <properties>
		<spring-boot-dependencies.version>2.1.9.RELEASE</spring-boot-dependencies.version>
		<spring-cloud-dependencies.version>Greenwich.SR2</spring-cloud-dependencies.version>
		<spring-cloud-starter-eureka-server.version>1.3.6.RELEASE</spring-cloud-starter-eureka-server.version>
		<spring-cloud-starter-eureka.version>1.3.6.RELEASE</spring-cloud-starter-eureka.version>
		<druid.version>1.0.31</druid.version>
		<mybatis-spring-boot-starter.version>1.3.2</mybatis-spring-boot-starter.version>
		<springloaded.version>1.2.0.RELEASE</springloaded.version>
	</properties>
	<!--父工程只做依赖管理,不做实际依赖-->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>${spring-boot-dependencies.version}</version>
				<type>pom</type>
				<!--maven项目只能单继承,因此这里使用 import-->
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>${spring-cloud-dependencies.version}</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-starter-eureka-server</artifactId>
				<version>${spring-cloud-starter-eureka-server.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-starter-eureka</artifactId>
				<version>${spring-cloud-starter-eureka.version}</version>
			</dependency>
			<dependency>
				<groupId>com.alibaba</groupId>
				<artifactId>druid</artifactId>
				<version>${druid.version}</version>
			</dependency>
			<dependency>
				<groupId>org.mybatis.spring.boot</groupId>
				<artifactId>mybatis-spring-boot-starter</artifactId>
				<version>${mybatis-spring-boot-starter.version}</version>
			</dependency>
			<dependency>
				<groupId>org.springframework</groupId>
				<artifactId>springloaded</artifactId>
				<version>${springloaded.version}</version>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<!-- modules里面的东西是通过后期配置的 -->
	<modules>
		<module>Cloud-Api</module>
		<module>Cloud-EurekaServer</module>
		<module>Cloud-Provider</module>
		<module>Cloud-Consumer</module>
	</modules>
</project>

😏 二.Cloud-Api (子模块 api)(一般存放Entity)

1.创建 Maven Model工程

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

2.添加pom依赖
	由于我的Api里面只想存Entity,所以pom不需要添加新的依赖了,有想用小辣椒的小伙伴可以添加Lombok,根据自己需求添加即可。
3.新建一个 entities 的包, 再新建一个 Student 类,之后测试使用

在这里插入图片描述

package com.hongxiang.entities;

public class Student {
	private String studentId;
	private String studentName;
	private String gender;
	private String classId;
	private String teacherId;
	//GET SET 自行生成
}
😏 三.Cloud-Eureka-Server (子模块 用来注册服务)
1.创建 Maven Model工程
	跟上面创建Cloud-Api一样就不重复了,参照Cloud-Api的创建。
2.添加pom依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.hongxiang</groupId>
    <artifactId>Cloud-Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>Cloud-EurekaServer</artifactId>
  
  <dependencies>
 
		<!-- spring-cloud-starter-eureka-server -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka-server</artifactId>
		</dependency>
 
		<!-- 热部署 -->
		<!-- springloaded -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
 
		<!-- spring-boot-devtools -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
		
		        <dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>
	</dependencies>
</project>
3.配置application.yml
	默认不生成,在src/main/resources下新建即可。
server:
  port: 7001
eureka:
  instance:
    hostname: localhost #eureka服务端的实例名称
  client:
    register-with-eureka: false #服务端无需注册自己
    fetch-registry: false #表示是否从eureka-server获取注册信息
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与eureka-server交互的地址查询服务和注册服务都需要依赖这个地址
4.创建启动类
package com.hongxiang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication_7001 {

	public static void main(String[] args) {
		SpringApplication.run(EurekaServerApplication_7001.class, args);
	}

}
5.启动服务
	访问http://localhost:7001/ 验证是否访问到 Eureka界面
😏 四.Cloud-provider (子模块 提供服务)
	这里整合的是 Mybatis + Postgre
1.创建 Maven Model工程
	跟上面创建Cloud-Api一样就不重复了,参照Cloud-Api的创建。
2.添加pom依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.hongxiang</groupId>
    <artifactId>Cloud-Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>Cloud-Provider</artifactId>
  
  <dependencies>
 
		<!-- springcloud-api 可以取到 entities 的信息 -->
		<dependency>
			<groupId>com.hongxiang</groupId>
			<artifactId>Cloud-Api</artifactId>
			<version>${project.version}</version>
		</dependency>
 
		<!-- spring-boot-starter-web -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
 
		<!-- spring-cloud-starter-eureka -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
 
		<!-- druid(数据库连接池) -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
		</dependency>
 
		<!-- mybatis-spring-boot-starter -->
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
		</dependency>
 
		<!-- 热部署 -->
		<!-- springloaded -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
 
		<!-- spring-boot-devtools -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
		
		<!-- 加载postgresql驱动 -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
		
	</dependencies>
  
</project>
3.在数据库中添加 student 表以及表信息
CREATE TABLE "student" (
"student_id" VARCHAR(32) NOT NULL ,
"student_name" VARCHAR(32) NULL ,
"gender" VARCHAR(4) NULL ,
"class_id" VARCHAR(32) NULL ,
"teacher_id" VARCHAR(32) NULL ,
PRIMARY KEY (student_id")
);
 
INSERT INTO "student" VALUES(
'001', 'banana', '男', '1024', '2048'
);
4.配置application.yml
	默认不生成,在src/main/resources下新建即可。
server:
  port: 8001
 
mybatis:
  config-location: classpath:mybatis/mybatis-config.xml #mybatis配置文件所在路径
  mapper-locations:
  - classpath:mybatis/mapper/**/*.xml  #mapper映射文件
  
spring:
  application:
    name: springcloud-provider-dept #对外暴露的微服务的名字(微服务最重要的名字)
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型
    driverClassName: org.postgresql.Driver #数据库名称
    url: jdbc:postgresql://localhost:5432/test?useSSL=false
    username: ****** #用户名
    password: ****** #密码
    dbcp2: #druid 数据库连接池的配置
      min-idle: 5 #最小闲置连接数
      initial-size: 5 #初始化连接数
      max-total: 5 #最大总连接数
      max-wait-millis: 200 #最长连接等待时间
      
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7001/eureka #将服务注册进eureka-server服务列表中
  instance:
    instance-id: Cloud-Provider-8001
    prefer-ip-address: true  
5.配置mybatis自动生成的xml
	在 src/main/resource/mybatis 下新建 mybatis-config.xml 配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
 
	<!--开启二级缓存 -->
	<settings>
		<setting name="cacheEnabled" value="true" />
	</settings>
</configuration>

6.创建 StudentDao 接口
	可以通过上面配置的xml自动生成,需要的话自行百度
package com.hongxiang.dao;

import org.apache.ibatis.annotations.Mapper;

import com.hongxiang.entities.Student;

@Mapper
public interface StudentDao {

	Student findById(String studentId);
}

7.生成StudentMapper.xml 映射文件
	可以通过上面配置的xml自动生成,需要的话自行百度,最好放在 src/main/resource/mybatis/mapper/student
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hongxiang.dao.StudentDao">
 
	<resultMap type="com.hongxiang.entities.Student" id="StudentMap">
		<id property="studentId" column="STUDENT_ID" />
		<result property="studentName" column="STUDENT_NAME" />
	</resultMap>
 
	<select id="findById" parameterType="java.lang.String"
		resultMap="StudentMap">
		select *
		from student
		where student_id = #{studentId}
	</select>
 
</mapper>
8.创建 StudentService 接口
package com.hongxiang.service;

import com.hongxiang.entities.Student;

public interface StudentService {

	Student findById(String studentId);
}

9.创建 StudentServiceImpl 实现类
package com.hongxiang.service.impl;

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

import com.hongxiang.dao.StudentDao;
import com.hongxiang.entities.Student;
import com.hongxiang.service.StudentService;

@Service
public class StudentServiceImpl implements StudentService {

	@Autowired
	private StudentDao studentDao;

	@Override
	public Student findById(String studentId) {
		return studentDao.findById(studentId);
	}

}
10.创建 StudentController 类
package com.hongxiang.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import com.hongxiang.entities.Student;
import com.hongxiang.service.StudentService;

@RestController
public class StudentController {

	@Autowired
	private StudentService studentService;

	@GetMapping("/server/student/get/{studentId}")
	public Student findById(@PathVariable("studentId") String studentId) {
		return studentService.findById(studentId);
	}
}

11.创建启动类
package com.hongxiang;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan(basePackages = "com.hongxiang.dao")
public class ProviderServerApplication_8001 {

	public static void main(String[] args) {
		SpringApplication.run(ProviderServerApplication_8001.class, args);
	}

}

12.启动服务
	访问 http://localhost:8001/server/student/get/001  验证是否返回数据库对应的json数据
😏 五.Cloud-Consumer (子模块 服务消费模块)
1.创建 Maven Model工程
	跟上面创建Cloud-Api一样就不重复了,参照Cloud-Api的创建。
2.添加pom依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.hongxiang</groupId>
    <artifactId>Cloud-Parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>Cloud-Consumer</artifactId>
  
	<dependencies>
		<!-- spring-api -->
		<dependency>
			<groupId>com.hongxiang</groupId>
			<artifactId>Cloud-Api</artifactId>
			<version>${project.version}</version>
		</dependency>
 
		<!-- spring-boot-starter-web -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
 
		<!-- 热部署 -->
		<!-- springloaded -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
 
		<!-- spring-boot-devtools -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
 
	</dependencies>
</project>
3.配置application.yml
server:
  port: 80
4.创建 ConfigBean 配置类
package com.hongxiang.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class ConfigBean {

	@Bean
	public RestTemplate getRestTemplate() {
		return new RestTemplate();
	}
}
5.创建 StudentController 类
package com.hongxiang.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.hongxiang.entities.Student;

@RestController
public class StudentController {

	private static final String REST_URL_PREFIX = "http://localhost:8001";

	@Autowired
	private RestTemplate restTemplate;

	@GetMapping("/consumer/student/get/{studentId}")
	public Student select(@PathVariable("studentId") String studentId) {
		return restTemplate.getForObject(REST_URL_PREFIX + "/server/student/get/" + studentId, Student.class);
	}

}
6.创建启动类
package com.hongxiang;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ConsumerApplication_80 {

	public static void main(String[] args) {
		SpringApplication.run(ConsumerApplication_80.class, args);
	}

}
12.启动服务
	访问 http://localhost:80/consumer/student/get/001   验证是否返回数据库对应的json数据

😎 😎 😎 大功告成!

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Cloud是一套用于构建分布式系统的工具集,它提供了一系列的组件和库,可以帮助开发者快速搭建分布式架构。下面是基于Spring Cloud搭建分布式架构的步骤: 1. 注册中心:Spring Cloud提供了服务注册与发现的功能,可以使用Eureka、Consul、Zookeeper等作为注册中心。通过将所有微服务都注册到注册中心,其他微服务就可以通过注册中心来发现和调用。 2. 服务提供者与消费者:通过Spring Cloud的负载均衡和服务调用功能,我们可以轻松实现服务提供者和消费者的通信。服务提供者将自己的服务注册到注册中心后,消费者可以通过调用注册中心的接口来获取服务列表,并通过负载均衡策略选择一个提供者进行调用。 3. 断路器和降级:为了保证系统的稳定性,Spring Cloud提供了断路器和降级的支持。当某个服务不可用或超时时,断路器可以自动切断对该服务的调用,并返回预先设定的默认值或执行降级逻辑,避免级联故障。 4. 配置中心:Spring Cloud提供了分布式配置中心,可以将配置文件集中管理,并在所有微服务中进行统一的快速更新和下发。通过配置中心,可以实现对不同环境的配置分离和动态更新。 5. 网关和路由:Spring Cloud Gateway和Zuul都是Spring Cloud提供的网关组件,可以用于统一管理和转发微服务的请求。通过配置路由规则,可以实现请求的转发、限流、鉴权等功能,提供更加灵活和安全的访问控制。 通过以上步骤,我们可以基于Spring Cloud搭建一个完整的分布式架构。它帮助我们简化了分布式系统的开发和部署,提供了许多功能模块,包括服务注册与发现、服务调用、断路器和降级、配置中心、网关和路由等。这使得我们可以更加方便地构建和管理分布式系统,提高开发效率和系统的可靠性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值