从0开始搭载springcloud手脚架在docker容器(二)

本文详细介绍了如何使用Spring Cloud Eureka搭建服务集群,包括Maven项目模块化、Docker镜像构建、推送及拉取,以及配置安全和集群环境。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本节主要是在服务器搭建eureka服务集群,涉及知识点有:
springcloud-eureka的搭建
maven项目模块化
docker构建自己的镜像
docker推送和拉取自己的镜像
docker构建镜像命令说明
docker运行容器

  1. 新增项目
    在这里插入图片描述在这里插入图片描述
    删掉src文件夹,此项目作为公共依赖定义处,定义了springcloud的依赖版本
    pom文件如下
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
    <packaging>pom</packaging>
    <parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.6.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.springcloudPrice</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
		<spring-cloud.version>Greenwich.SR1</spring-cloud.version>
		<docker.image.prefix>spring-cloud-demo</docker.image.prefix>
	</properties>
	<modules>
		<module>eureka</module>
	</modules>

    <dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</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>

	<repositories>
		<repository>
			<id>central</id>
			<name>aliyun maven</name>
			<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
			<layout>default</layout>
			<!-- 是否开启发布版构件下载 -->
			<releases>
				<enabled>true</enabled>
			</releases>
			<!-- 是否开启快照版构件下载 -->
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
			<!--docker 插件-->
			<plugin>
				<groupId>com.spotify</groupId>
				<artifactId>docker-maven-plugin</artifactId>
				<version>0.4.3</version>
				<configuration>
					<imageName>${docker.image.prefix}/${project.artifactId}</imageName>
					<dockerDirectory>src/main/docker</dockerDirectory>
					<resources>
						<resource>
							<targetPath>/</targetPath>
							<directory>${project.build.directory}</directory>
							<include>${project.build.finalName}.jar</include>
						</resource>
					</resources>
				</configuration>
			</plugin>
		</plugins>
	</build>


</project>

  1. 新增eureka模块
    右键父项目->new->module
    在这里插入图片描述在这里插入图片描述
    选中eureka依赖,security依赖在这里插入图片描述
    在这里插入图片描述
    pom文件里,父节点改为步骤1中新增的项目
<?xml version="1.0" encoding="UTF-8"?>
<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<!--父节点依赖修改-->
	<parent>
		<groupId>com.springcloudPrice</groupId>
		<artifactId>demo</artifactId>
		<version>0.0.1-SNAPSHOT</version>
	</parent>
	<groupId>com.springcloudPrice</groupId>
	<artifactId>eureka</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>eureka</name>
	<description>Demo project for Spring Boot</description>
	<dependencies>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-netflix-eureka-client</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-security</artifactId>
		</dependency>
	</dependencies>
</project>

进入父节点pom文件,modules里增加一个子项目eureka
在这里插入图片描述

<modules>
	<module>eureka</module>
</modules>

修改启动类EurekaApplication

@SpringBootApplication
@EnableEurekaServer
@EnableDiscoveryClient
public class EurekaApplication {

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

}

新增权限控制配置WebSecurityConfig

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // 关闭csrf
        http.csrf().ignoringAntMatchers("/eureka/**");
        super.configure(http);
    }
}

配置application.yml

server:
  port: 8761
eureka:
  instance:
    hostname: eureka
  client:
    #  表示是否将自己注册到Eureka Servcer。
    register-with-eureka: false
    #  表示是否从Eureka Server获取注册信息
    fetchRegistry: false
    serviceUrl:
     #  设置Eureka Server交互的地址@前面配置的是security里的账户和密码
       defaultZone: httpp://admin:pass@localhost:8761
spring:
  application:
    name: eureka-server
 #设置安全
  security:
    user:
      name: admin
      password: pass

启动项目,没有问题可进入下一步

  1. 构造自己的eureka镜像
    在java的同一级目录下,新增docker目录,新增一个Dockerfile文件,文件内容如下
#需拉取java依赖
FROM java:8
#拉取eureka-0.0.1-SNAPSHOT.jar到容器里的/tmp目录下,重命名为app.jar
VOLUME /tmp
ADD eureka-0.0.1-SNAPSHOT.jar app.jar
#运行app.jar文件
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
#容器对外暴露8761端口
EXPOSE 8761

使用idea的插件工具打包项目
在这里插入图片描述
生成Dockerfile里的jar文件在这里插入图片描述
使用idea里的docker插件,
在这里插入图片描述
到docker里查看新增的镜像,如有
spring-cloud-demo/eureka 说明构建镜像成功

docker images
  1. 推送镜像到阿里云容器云上
    根据阿里云容器服务里操作指南即可,注意仓库必须是公开的,否则好像访问不了。
    操作命令如下
#登录
sudo docker login --username= registry.cn-shenzhen.aliyuncs.com
#打一版本
sudo docker tag [ImageId] registry.cn-shenzhen.aliyuncs.com/#####/eureka:[镜像版本号]
#推送
sudo docker push registry.cn-shenzhen.aliyuncs.com/#####/eureka:[镜像版本号]
  1. 在服务器上拉取镜像运行
sudo docker login --username= registry.cn-shenzhen.aliyuncs.com
sudo docker pull registry.cn-shenzhen.aliyuncs.com/#####/eureka:[镜像版本号]

查看拉取的镜像

docker images

运行容器服务

docker run -d -p 8761:8761 --name eureka 镜像名:镜像版本  --eureka.client.serviceUrl.defaultZone=其他eureka实例的服务器ip和地址

命令说明
-d 后台运行
-p 8761:8761 容器8761端口对应宿主机8761端口
–name 容器名称
–eureka.client.serviceUrl.defaultZone=其他eureka实例的服务器ip和地址,多个逗号隔开。
这个是配置集群的配置,配置内容为向配置的eureka注册自己的信息,jar xxx.jar --参数=配置 这个参数传入的方法是springboot方式,后面启动业务服务的时候也会用到这种方式。
譬如由a地址和b地址组成eureka集群
启动a的eureka服务时则配置为
http://admin:pass@b/eureka/
启动b的eureka服务配置为:

http://admin:pass@a/eureka/`

在启动时决定当前服务的参数,这样就可以减少构建多个容器镜像,在大型集群的时候时十分重要的,因为不可能一个ip就配置一个容器镜像。

启动成功后即可看到eureka的界面
在这里插入图片描述
6.一些docker其他命令
查看菜鸟教程菜鸟教程

### 使用Transformer模型进行图像分类的方法 #### 方法概述 为了使Transformer能够应用于图像分类任务,一种有效的方式是将图像分割成固定大小的小块(patches),这些小块被线性映射为向量,并加上位置编码以保留空间信息[^2]。 #### 数据预处理 在准备输入数据的过程中,原始图片会被切分成多个不重叠的patch。假设一张尺寸为\(H \times W\)的RGB图像是要处理的对象,则可以按照设定好的宽度和高度参数来划分该图像。例如,对于分辨率为\(224\times 224\)像素的图像,如果选择每边切成16个部分的话,那么最终会得到\((224/16)^2=196\)个小方格作为单独的特征表示单元。之后,每一个这样的补丁都会通过一个简单的全连接层转换成为维度固定的嵌入向量。 ```python import torch from torchvision import transforms def preprocess_image(image_path, patch_size=16): transform = transforms.Compose([ transforms.Resize(256), transforms.CenterCrop(224), # 假设目标分辨率是224x224 transforms.ToTensor(), ]) image = Image.open(image_path).convert('RGB') tensor = transform(image) patches = [] for i in range(tensor.shape[-2] // patch_size): # 高度方向上的循环 row_patches = [] for j in range(tensor.shape[-1] // patch_size): # 宽度方向上的循环 patch = tensor[:, :, i*patch_size:(i+1)*patch_size, j*patch_size:(j+1)*patch_size].flatten() row_patches.append(patch) patches.extend(row_patches) return torch.stack(patches) ``` #### 构建Transformer架构 构建Vision Transformer (ViT),通常包括以下几个组成部分: - **Patch Embedding Layer**: 将每个图像块转化为低维向量; - **Positional Encoding Layer**: 添加绝对或相对位置信息给上述获得的向量序列; - **Multiple Layers of Self-Attention and Feed Forward Networks**: 多层自注意机制与前馈神经网络交替堆叠而成的核心模块; 最后,在顶层附加一个全局平均池化层(Global Average Pooling)以及一个多类别Softmax回归器用于预测类标签。 ```python class VisionTransformer(nn.Module): def __init__(self, num_classes=1000, embed_dim=768, depth=12, num_heads=12, mlp_ratio=4., qkv_bias=False, drop_rate=0.): super().__init__() self.patch_embed = PatchEmbed(embed_dim=embed_dim) self.pos_embed = nn.Parameter(torch.zeros(1, self.patch_embed.num_patches + 1, embed_dim)) self.cls_token = nn.Parameter(torch.zeros(1, 1, embed_dim)) dpr = [drop_rate for _ in range(depth)] self.blocks = nn.Sequential(*[ Block( dim=embed_dim, num_heads=num_heads, mlp_ratio=mlp_ratio, qkv_bias=qkv_bias, drop=dpr[i], ) for i in range(depth)]) self.norm = nn.LayerNorm(embed_dim) self.head = nn.Linear(embed_dim, num_classes) def forward(self, x): B = x.shape[0] cls_tokens = self.cls_token.expand(B, -1, -1) x = self.patch_embed(x) x = torch.cat((cls_tokens, x), dim=1) x += self.pos_embed x = self.blocks(x) x = self.norm(x) return self.head(x[:, 0]) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值