草庐IT

企业级容器云平台的落地与实践

hsbxxl 2023-03-28 原文
        随着IT行业的发展和变迁,IT应用的底层支持也从大型机、小型机、PC服务器、虚拟化技术,到如今的容器化。基于敏捷开发的持续迭代,持续部署,以及多样化的技术栈,传统的底层架构变得越来越冗杂,运维管理越来越力不从心,运维人员也逐步陷落在无尽的“救火”运维模式。

        容器技术的出现,从根本上改变了这一切。而容器高效的编排与管理,才是让其风光无限的前提条件。Kubernetes经过多年的发展,已经成为行业的事实标准。而如何利用好Kubernetes,为企业的发展助力,成为很多企业,尤其是初创企业无法忽略的一道难题。

        本文将介绍利用Amazon EKS打造企业级容器云平台,通过一系列的实践操作,让大家直观地了解AWS是如何帮助企业高效地部署、管理容器化应用。

1.    传统应用架构的容器化之路

        说到“传统”二字,大家第一反应,就是“落后”,“守旧”,然而现实情况却是----绝大部分传统应用,依然在良好地运行在这些传统架构中。这些被服务的对象不会因为某些因素对整个系统资源的需求发生很大变化,也不会有频繁的系统功能的迭代开发需求。

        但是随着互联网、大数据、AI等技术的发展,各行各业都在努力地从信息化向智能化转型。而转型的过程中,越来越多的应用场景,和频繁地迭代开发,也让“传统”架构越来越庞大。随之而来的是运维人员疲于奔命的“救火”,系统服务越来越不稳定,以及系统成本的失控飞涨。

        如何才能从根本上一劳永逸地解决这些问题? 容器化/微服务化是很多企业寄予厚望的方向。

容器化真的那么有效吗?

        我们以下图为例。这是一个很通用的架构,在多台服务器上分别部署Tomcat,使用反向代理软件(Nginx)把请求均匀分发到每个Tomcat中。假定由于11.11促销,我们需要将现有的3台Tomcat扩充到10台,运维人员需要完成哪些工作?(假设服务器硬件已经准备好)

传统系统的扩容步骤:

1.    安装OS,设置安全和权限相关
2.    分配IP,联网
3.    部署Tomcat
4.    以上动作做7遍

        仅仅一个扩容,就需要一个资深的运维人员花费几个小时才能完成。如果要扩充到100个节点呢,工作量成倍增加。

容器化系统扩容步骤:

        如果我们使用容器化技术来完成刚刚这件事,就会节省很多人力。

1.    安装OS,并由Kubernetes统一管理
2.    一条命令足以,并且在秒级完成扩展

kubectl scale rc tomcat --replicas=103.    完成

        简单的一个对比,即可发现,在资源分配,系统稳定(自愈),运维管理等多个方面,容器化技术都可有效地降低企业的成本和运维压力,并且让企业保持技术的敏捷性和先进性。


 2.    容器化应用场景

        刚刚讨论过容器化对于企业的价值,接下来要继续分析哪些场景适合容器化。

        容器化很重要的特点,就是轻量化和无状态。而像传统的企业应用软件,承载业务模块众多,功能流程繁琐,因此并不适合容器化改造。具体哪些应用场景比较适合呢?主要包含以下几种场景(当然,这只是几种常见情况,业务场景满足轻量化、无状态的特点都是可以尝试容器化技术)

2.1.        应用打包
2.2.        多版本混合部署
2.3.        升级回滚
2.4.        多租户资源隔离
2.5.        内部开发环境

         我们一直在说容器化(Docker为代表)的各种优势,但是企业在真正的生产环境中,如果只是通过Docker来实现容器化,是无法满足高可用、弹性扩展和高并发等场景需求。而Kubernetes的出现,才让Docker真正在生产环境中被大规模使用起来。Kubernetes提供了应用部署、规划、更新、维护的一种机制,让容器化应用的部署和管理更简单、更高效,。

Kubernetes的特点:

·                可移植: 支持公有云,私有云,混合云,多云(multi-cloud
·                可扩展: 模块化,插件化,可挂载,可组合
·                自动化: 自动部署,自动重启,自动复制,自动伸缩/扩展

        Kubernetes结合Docker,让企业容器化之路变得更加容易,从而更快地满足业务需求。 但是,事物都是有两面性,并不是所有项目都适合容器化改造,而且任何的改动都有可能产生未知的影响,要对技术保持敬畏,对生产保持敬畏,才能在容器化的道路上走的更稳。

        Kubernetes虽好,但是对于很多初创企业,和没有太多相关技术积累的传统企业,Kubernetes的学习成本过高,企业会在底层架构的高可用性、网络、机房等方面遇到一系列问题,从而让容器化之路满是荆棘。

3.    Amazon EKS助力企业快速实现容器化转型

        如何快速、高效地拥有自己的容器化平台呢?下面一段,就是AWS官网上Amazon EKS的介绍:

        Amazon EKS 是一项托管服务,可让您在 AWS 上轻松运行 Kubernetes,而无需安装、操作和维护您自己的 Kubernetes 控制层面或节点。Kubernetes 是一个用于实现容器化应用程序的部署、扩展和管理的自动化的开源系统。

        Amazon EKS 跨多个可用区运行 Kubernetes 控制层面实例以确保高可用性。Amazon EKS 可以自动检测和替换运行状况不佳的控制层面实例,并为它们提供自动版本升级和修补。

        Amazon EKS 与许多 AWS 服务集成以便为您的应用程序提供可扩展性和安全性,包括:

·             用于容器镜像的 Amazon ECR
·              用于负载分配的 Elastic Load Balancing
·              用于身份验证的 IAM
·              用于隔离的 Amazon VPC

        Amazon EKS 运行最新版本的开源 Kubernetes 软件,因此您可以使用 Kubernetes 社区中的所有现有插件和工具。在 Amazon EKS 上运行的应用程序与在任何标准 Kubernetes 环境中运行的应用程序完全兼容,无论此类环境是在本地数据中心还是在公有云中运行都是如此。这意味着,您可以轻松地将任何标准 Kubernetes 应用程序迁移到 Amazon EKS,而无需修改任何代码。

4.    理论结合实际,让容器化更直观

        理论说了一大堆,不如动手玩起来。下面,我设计一个场景,在Amazon EKS上逐步完成容器化部署,并逐步在每个环节介绍技术细节。

1) 通过Nginx,做三个页面web1,web2,web3
2)将三个web页面作为一组服务,由Amazon EKS管理
3) 通过http访问,轮询到三个不同的页面,来看到效果

        注释:web1,web2,web3实际生产应该是一个业务,只不过为了显示实验效果,通过不同的页面,展示轮询的效果

 4.1.  环境准备

4.1.1.    需要一个AWS账号
4.1.2.    账号资源限制检查,确保有足够的IGW,VPC,EIP等
4.1.3.    安装awscli(包含eksctl)及配置kubectl:

4.1.3.1.        awscli安装:

curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" unzip awscliv2.zip sudo ./aws/install检查安装结果

$ aws --version
安装方法参考链接:
https://docs.aws.amazon.com/zh_cn/cli/latest/userguide/cli-chap-install.html

4.1.3.2.        配置kubectl,

aws eks --region cn-northwest-1 update-kubeconfig --name my-zhy-eks官方配置方法链接:
https://docs.amazonaws.cn/eks/latest/userguide/create-kubeconfig.html

 4.2.       创建Amazon EKS集群:

4.2.1.   创建命令

#命令,参数注释

--node-type 工作节点类型
--nodes 工作节点数量
CLUSTER_NAME 集群名称
AWS_REGION cn-northwest-1:宁夏区; cn-north-1:北京区

创建命令:

AWS_REGION=cn-northwest-1 AWS_DEFAULT_REGION=cn-northwest-1 CLUSTER_NAME=my-zhy-eks eksctl create cluster --name=${CLUSTER_NAME} --version 1.15 --nodes=3 --node-type t3.medium --managed --alb-ingress-access --region=${AWS_REGION}

4.2.2.    成功执行的输出:

eksctl create cluster --name=${CLUSTER_NAME} --version 1.15 --nodes=3 --node-type t3.medium --managed --alb-ingress-access --region=${AWS_REGION} [ℹ]  eksctl version 0.32.0 [ℹ]  using region cn-northwest-1 [ℹ]  setting availability zones to [cn-northwest-1b cn-northwest-1c cn-northwest-1a] [ℹ]  subnets for cn-northwest-1b - public:192.168.0.0/19 private:192.168.96.0/19 [ℹ]  subnets for cn-northwest-1c - public:192.168.32.0/19 private:192.168.128.0/19 [ℹ]  subnets for cn-northwest-1a - public:192.168.64.0/19 private:192.168.160.0/19 [ℹ]  using Kubernetes version 1.15 [ℹ]  creating EKS cluster "my-zhy-eks" in "cn-northwest-1" region with managed nodes [ℹ]  will create 2 separate CloudFormation stacks for cluster itself and the initial managed nodegroup [ℹ]  if you encounter any issues, check CloudFormation console or try 'eksctl utils describe-stacks --region=cn-northwest-1 --cluster=my-zhy-eks' [ℹ]  CloudWatch logging will not be enabled for cluster "my-zhy-eks" in "cn-northwest-1" [ℹ]  you can enable it with 'eksctl utils update-cluster-logging --enable-types={SPECIFY-YOUR-LOG-TYPES-HERE (e.g. all)} --region=cn-northwest-1 --cluster=my-zhy-eks' [ℹ]  Kubernetes API endpoint access will use default of {publicAccess=true, privateAccess=false} for cluster "my-zhy-eks" in "cn-northwest-1" [ℹ]  2 sequential tasks: { create cluster control plane "my-zhy-eks", 2 sequential sub-tasks: { no tasks, create managed nodegroup "ng-e5146e45" } } [ℹ]  building cluster stack "eksctl-my-zhy-eks-cluster" [ℹ]  deploying stack "eksctl-my-zhy-eks-cluster" [ℹ]  building managed nodegroup stack "eksctl-my-zhy-eks-nodegroup-ng-e5146e45" [ℹ]  deploying stack "eksctl-my-zhy-eks-nodegroup-ng-e5146e45" [ℹ]  waiting for the control plane availability... [✔]  saved kubeconfig as "/root/.kube/config" [ℹ]  no tasks [✔]  all EKS cluster resources for "my-zhy-eks" have been created [ℹ]  nodegroup "ng-e5146e45" has 3 node(s) [ℹ]  node "ip-192-168-5-37.cn-northwest-1.compute.internal" is ready [ℹ]  node "ip-192-168-58-97.cn-northwest-1.compute.internal" is ready [ℹ]  node "ip-192-168-65-234.cn-northwest-1.compute.internal" is ready [ℹ]  waiting for at least 3 node(s) to become ready in "ng-e5146e45" [ℹ]  nodegroup "ng-e5146e45" has 3 node(s) [ℹ]  node "ip-192-168-5-37.cn-northwest-1.compute.internal" is ready [ℹ]  node "ip-192-168-58-97.cn-northwest-1.compute.internal" is ready [ℹ]  node "ip-192-168-65-234.cn-northwest-1.compute.internal" is ready [ℹ]  kubectl command should work with "/root/.kube/config", try 'kubectl get nodes' [✔]  EKS cluster "my-zhy-eks" in "cn-northwest-1" region is ready

4.2.3.    Eksctl执行之后,需要等待10分钟左右。模式很简单的步骤,其实是AWS通过调用cloudformation在后台做了许多工作才完成的。下图是cloudformation的stack步骤:


4.2.4.    Amazon EKS完成后的,cloudformation状态


4.2.5.    查询node状态信息

#  kubectl get node NAME                                                STATUS   ROLES    AGE   VERSION ip-192-168-5-37.cn-northwest-1.compute.internal     Ready    <none>   11m   v1.15.12-eks-31566f ip-192-168-58-97.cn-northwest-1.compute.internal    Ready    <none>   11m   v1.15.12-eks-31566f ip-192-168-65-234.cn-northwest-1.compute.internal   Ready    <none>   11m   v1.15.12-eks-31566f

4.2.6.     扩展集群节点方法

        我们之前通过eksctl创建了一个3节点的集群[WHE5] [XX6] ,如果由于业务的增加,希望扩容的话,如何操作呢?具体命令参考如下,将当前集群,扩容到10个节点:

NODE_GROUP=$(eksctl get nodegroup --cluster ${CLUSTER_NAME} --region=${AWS_REGION} -o json | jq -r '.[].Name') eksctl scale nodegroup --cluster=${CLUSTER_NAME} --nodes=10 --name=${NODE_GROUP} --region=${AWS_REGION}检查结果

eksctl get nodegroup --cluster ${CLUSTER_NAME} --region=${AWS_REGION} eksctl get cluster NAME            REGION my-zhy-eks      cn-northwest-14.3.       Amazon ECR的使用

       针对一个企业,很多image都是定制化的,而定制化的私有image管理,在AWS是如何操作的呢? Amazon ECR,让image的管理,变得更简单易用。下面通过httpd的image,定制化并生成私有httpdok的image之后,并上传到Amazon ECR,作为步骤演示:

4.3.1.    首先创建一个Amazon ECR Repositories,选择并点击View push commands.

4.3.2.    根据”View puhs commands”步骤,将本地创建好的image,上传到Amazon ECR。


具体命令步骤:

# aws ecr get-login-password --region cn-northwest-1 | docker login --username AWS --password-stdin <account_id>.dkr.ecr.cn-northwest-1.amazonaws.com.cn查看本地镜像

# docker images REPOSITORY                                                    TAG                 IMAGE ID            CREATED             SIZE httpdok                                                       v1                  df353399ffe4        7 seconds ago       299MB为镜像打标签

# docker tag httpdok:latest <account_id>.dkr.ecr.cn-northwest-1.amazonaws.com.cn/httpdok:latest在查看本地Docker的images,可以看到已经出现一个新的,有ECR连接串的image

# docker images REPOSITORY                                                     TAG                 IMAGE ID            CREATED             SIZE <account_id>.dkr.ecr.cn-northwest-1.amazonaws.com.cn/httpdok   latest              9028c4373343        4 minutes ago       299MB httpdok                                                        latest              9028c4373343        4 minutes ago       299MB推送image到ECR上

# docker push <account_id>.dkr.ecr.cn-northwest-1.amazonaws.com.cn/httpdok:latest The push refers to repository [<account_id>.dkr.ecr.cn-northwest-1.amazonaws.com.cn/httpdok]回到aws控制台,已经可以看到上传的image

4.4.       Amazon EKS实例演示

下面开始部署容器到Amazon EKS中,通过Nginx来演示如何部署image到Amazon EKS,并轮询访问.

4.4.1.    启动三个nginx pod 的 ReplicaSet

准备yaml文件

cat <<EOF > nginx-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata:   name: nginx-deployment   labels:     app: nginx spec:   replicas: 3   selector:     matchLabels:       app: nginx   template:     metadata:       labels:         app: nginx     spec:       containers:       - name: nginx         image: nginx:1.14.2         ports:         - containerPort: 80 EOF执行以下命令,进行部署

kubectl apply -f nginx-deployment.yaml检查创建状态

kubectl get pods -o wide

4.4.2.    创建LoadBalancer 服务

准备yaml文件

cat <<EOF > loadbalancer.yaml apiVersion: v1 kind: Service metadata:   name: nginx-service spec:   type: LoadBalancer   selector:     app: nginx   ports:     - protocol: TCP       port: 80       targetPort: 80 EOF执行以下命令,进行部署

kubectl create -f loadbalancer.yaml

4.4.3.    检查创建状态

kubectl get service NAME            TYPE           CLUSTER-IP       EXTERNAL-IP                                                                      PORT(S)        AGE nginx-service   LoadBalancer   10.100.212.244   ae8e75d7e149044eb905b6bbff796e7e-629951941.cn-northwest-1.elb.amazonaws.com.cn   80:31248/TCP   7m53s

4.4.4.    监测网页显示情况

curl -silent ae8e75d7e149044eb905b6bbff796e7e-629951941.cn-northwest-1.elb.amazonaws.com.cn | grep title <title>Welcome to nginx!</title>

至此,我们已经开始使用EKS上的Nginx集群了。但是为了建议Load balance的工作效果。我们继续下面的小实验,可以更好的观察load balance的效果

4.5.        轮询效果展示

4.5.1.    获取pod信息

kubectl get pod NAME                                READY   STATUS    RESTARTS   AGE nginx-deployment-574b87c764-92jbs   1/1     Running   0          10h nginx-deployment-574b87c764-hmz9t   1/1     Running   0          10h nginx-deployment-574b87c764-nqpmc   1/1     Running   0          10h

4.5.2.    以下命令是确定pod中nginx的欢迎界面的index.html位置

kubectl exec -it nginx-deployment-574b87c764-92jbs -- /usr/sbin/nginx -t kubectl exec -it nginx-deployment-574b87c764-92jbs -- cat /etc/nginx/nginx.conf  kubectl exec -it nginx-deployment-574b87c764-92jbs -- ls /usr/share/nginx/html kubectl exec -it nginx-deployment-574b87c764-92jbs -- cat /usr/share/nginx/html/index.html  kubectl exec -it nginx-deployment-574b87c764-92jbs -- cp/usr/share/nginx/html/index.html /usr/share/nginx/html/index.html.bk注释:kubectl exce的格式如下:

kubectl exec -it <podName> -c <containerName> -n <namespace> -- shell comand

4.5.3.    更改index.html内容

在本地编辑文件name.html,然后上传到3个Pod的容器中,

kubectl cp name.html nginx-deployment-574b87c764-nqpmc:usr/share/nginx/html/index.html注释: pod和本地之间传输文件命令格式
Pod下载文件到本地

kubectl cp -n NAMESPACE_name POD_name:Pod_FILE_name Local_FILE_name本地上传文件到Pod

kubectl cp Local_FILE_name -n NAMESPACE_name POD_name:Pod_FILE_name最终查询输出结果,多次查询,可以看到load balance会将连接随机分配到不同Pod节点

curl -silent ae8e75d7e149044eb905b6bbff796e7e-629951941.cn-northwest-1.elb.amazonaws.com.cn | grep Node输出结果如下:

5.    总结

        通过本文,大家已经对容器化有一个初步的了解,并且针对Amazon EKS打造的企业容器化平台也有了初步认知。Docker,Kubernetes对于企业的系统和业务的发展,有着不可忽视的“助推力”。

        然而,Kubernetes的学习曲线,以及企业的Kubernetes人才的积累,都是需要较长的“时间”成本。而借助云计算供应商的成熟平台和产品,可以降低企业的技术人才的积累成本,从而达到事半功倍的效果。

        我们通过这次实战的演练,可以看到,基于Amazon EKS创建容器化平台,只需一条命令。Amazon EKS让Kubernetes的创建,运行与维护变得简单、可靠。通过AWS Fargate,企业甚至可以完全省去虚拟机(EC2)的管理,只关注Kubernetes顶层业务架构的逻辑即可,进而可以将更多的“时间”专注在业务的开发,而不是被底层架构的种种问题所拖累,也可以让运维人员逃离无尽的“救火”式运维模式。

        你,准备好了吗? 容器化巨轮已经启航!来,让我们一起探索更多可能!

 

参考文档:

https://docs.amazonaws.cn/eks/latest/userguide/what-is-eks.html
https://eksctl.io/usage/creating-and-managing-clusters/
https://github.com/liangruibupt/EKS-Workshop-China
https://docs.amazonaws.cn/en_us/eks/latest/userguide/create-kubeconfig.html
https://amazonaws-china.com/cn/premiumsupport/knowledge-center/eks-kubernetes-services-cluster/
https://www.eksworkshop.com/beginner/130_exposing-service/ingress_controller_alb/
https://docs.aws.amazon.com/zh_cn/eks/latest/userguide/alb-ingress.html

有关企业级容器云平台的落地与实践的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. 叮咚买菜基于 Apache Doris 统一 OLAP 引擎的应用实践 - 2

    导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵

  3. ruby-on-rails - Rails 中同一个类的多个关联的最佳实践? - 2

    我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来

  4. ruby-on-rails - 向 Rails 3 添加 Ruby 扩展方法的最佳实践? - 2

    我有一个要在我的Rails3项目中使用的数组扩展方法。它应该住在哪里?我有一个应用程序/类,我最初把它放在(array_extensions.rb)中,在我的config/application.rb中我加载路径:config.autoload_paths+=%W(#{Rails.root}/应用程序/类)。但是,当我转到railsconsole时,未加载扩展。是否有一个预定义的位置可以放置我的Rails3扩展方法?或者,一种预先定义的方式来添加它们?我知道Rails有自己的数组扩展方法。我应该将我的添加到active_support/core_ext/array/conversion

  5. Ruby 最佳实践 : working with classes - 2

    参见下面的示例,我想最好使用第二种方法,但第一种也可以。哪种方法最好,使用另一种的后果是什么?classTestdefstartp"started"endtest=Test.newtest.startendclassTest2defstartp"started"endendtest2=Test2.newtest2.start 最佳答案 我肯定会说第二种变体更有意义。第一个不会导致错误,但对象实例化完全过时且毫无意义。外部变量在类的范围内不可见:var="string"classAvar=A.newendputsvar#=>strin

  6. ruby - 存储外部 API 的密码 - 最佳实践 - 2

    如果我构建了一个应用程序来访问来自Gmail、Twitter和Facebook的一些数据,并且我希望用户只需输入一次他们的身份验证信息,并且在几天或几周后重置,那会怎样是在Ruby中动态执行此操作的最佳方法吗?我看到很多人只是拥有他们客户/用户凭证的配置文件,如下所示:gmail_account:username:myClientpassword:myClientsPassword这看起来a)非常不安全,b)如果我想为成千上万的用户存储此类信息,它就无法工作。推荐的方法是什么?我希望能够在这些服务之上构建一个界面,因此每次用户进行交易时都必须输入凭据是不可行的。

  7. ruby-on-rails - 使用设计身份验证的 API 访问 - 最佳实践? - 2

    我正在使用Devise在Rails应用程序中,并希望通过API公开一些模型数据,但应该像应用程序一样限制对API的访问。$curlhttp://myapp.com/api/v1/sales/7.json{"error":"Youneedtosigninorsignupbeforecontinuing."}很明显。在这种情况下是否有访问API的最佳实践?我更喜欢一步验证+获取数据,但这只是为了让客户的工作更轻松。他们将使用JQuery在客户端提取数据。感谢您提供任何信息!凡妮莎 最佳答案 我建议您按照以下帖子中的选项2:使用APIke

  8. ruby-on-rails - 在多个页面上使用相同表单的 Rails 最佳实践 - 2

    我正在开发一个Rails2.3.1网站。在整个网站中,我需要一个用于在各种页面(主页、创建帖子页面、帖子列表页面、评论列表页面等)上创建帖子的表单——只要说这个表单需要在由各种Controller)。这些页面中的每一个都显示在相应的Controller/操作中检索到的各种其他信息。例如,主页列出了最新的10篇文章、从数据库中提取的内容等。因此,我已将帖子创建表单移动到它自己的部分中,并将该部分包含在所有必要的页面中。请注意,部分POST中的表单到/questions(路由到PostsController::create——这是默认的Rails行为)。我遇到的问题是当Posts表单没有正

  9. ruby-on-rails - Rails 'service objects' 最佳实践 - 类方法或实例化 - 2

    我正在按照我一直在研究的研讨会实现“服务对象”,我正在构建一个redditAPI应用程序。我需要对象返回一些东西,所以我不能只执行初始化程序中的所有内容。我有这两个选择:选项1:类需要实例化classSubListFromUserdefuser_subscribed_subs(client)@client=client@subreddits=sort_subs_by_name(user_subs_from_reddit)endprivatedefsort_subs_by_name(subreddits)subreddits.sort_by{|sr|sr[:name].downcase}

  10. 网页设计期末作业,基于HTML+CSS+JavaScript超酷超炫的汽车类企业网站(6页) - 2

    🎉精彩专栏推荐💭文末获取联系✍️作者简介:一个热爱把逻辑思维转变为代码的技术博主💂作者主页:【主页——🚀获取更多优质源码】🎓web前端期末大作业:【📚毕设项目精品实战案例(1000套)】🧡程序员有趣的告白方式:【💌HTML七夕情人节表白网页制作(110套)】🌎超炫酷的Echarts大屏可视化源码:【🔰Echarts大屏展示大数据平台可视化(150套)】🔖HTML+CSS+JS实例代码:【🗂️5000套HTML+CSS+JS实例代码(炫酷代码)继续更新中…】🎁免费且实用的WEB前端学习指南:【📂web前端零基础到高级学习视频教程120G干货分享】🥇关于作者:💬历任研发工程师,技术组长,教学总监;

随机推荐