卢氏县住房和城乡规划建设局网站苏州 手机网站

news/2025/9/22 18:59:22/文章来源:
卢氏县住房和城乡规划建设局网站,苏州 手机网站,怎样做好销售和客户交流,江西百度推广开户多少钱“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕#xff1f; 尝试使用Okta API进行托管身份验证#xff0c;授权和多因素身份验证。 在这篇文章中#xff0c;您将学习微服务架构以及如何使用Spring Boot来实现它。 在使… “我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕 尝试使用Okta API进行托管身份验证授权和多因素身份验证。 在这篇文章中您将学习微服务架构以及如何使用Spring Boot来实现它。 在使用该技术创建了一些项目之后您将把工件部署为Docker容器并使用Docker Compose进行简化以模拟容器编排器 例如Kubernetes。 锦上添花的是使用Spring Profiles进行身份验证集成。 您将了解如何通过生产资料启用它。 但是首先让我们谈谈微服务。 了解现代微服务架构 与整体架构相反微服务要求您将应用程序分成逻辑上相关的小块。 这些片段是独立的软件例如可以使用HTTP或消息与其他片段进行通信。 有一些关于微型尺寸的讨论。 有人说微服务是可以在单个冲刺中创建的软件。 其他人则说如果微服务在逻辑上相关例如您不能混合使用苹果和橙子则微服务的规模可能会更大。 我同意马丁·福勒 Martin Fowler的观点认为尺寸并没有多大关系它与款式息息相关。 微服务有许多优点 耦合风险不高 –由于每个应用程序都处于不同的进程中因此无法创建相互对话的类。 轻松扩展 –如您所知每项服务都是独立的软件。 因此它可以按需扩展或缩小。 此外由于代码比整体代码小 因此启动速度可能更快。 多个堆栈 –您可以为每个服务使用最佳的软件堆栈。 例如当Python对您正在构建的东西更好时就不再需要使用Java。 更少的合并和代码冲突 –由于每个服务都是一个不同的存储库因此更易于处理和检查提交。 但是有一些缺点 您有一个新的敌人- 网络问题 。 服务启动了吗 如果服务中断该怎么办 复杂的部署过程 – OK CI / CD在这里但是您现在为每个服务只有一个工作流程。 如果他们使用不同的堆栈则可能甚至无法为每个堆栈复制工作流程。 更复杂且难以理解的体系结构 –它取决于您的设计方式但请考虑以下问题如果您不知道方法的作用则可以阅读其代码。 在微服务体系结构中此方法可能在另一个项目中甚至可能没有代码。 如今通常应该首先避免使用微服务架构 。 经过一些迭代后代码划分将变得更加清晰项目的需求也将变得更加清晰。 在您的开发团队开始进行小型项目之前处理微服务通常过于昂贵。 在Spring使用Docker构建微服务 在本教程中您将构建两个项目一个服务school-service和一个UIschool_ui。 该服务提供持久层和业务逻辑而UI提供图形用户界面。 只需最少的配置即可连接它们。 初始设置后我将讨论发现和配置服务。 两种服务都是任何大规模分布式体系结构的重要组成部分。 为了证明这一点您将其与OAuth 2.0集成在一起并使用配置项目来设置OAuth 2.0密钥。 最后每个项目都将转换为Docker映像。 Docker Compose将用于模拟容器协调器因为Compose将使用服务之间的内部网络来管理每个容器。 最后将介绍Spring配置文件以根据当前适当分配的环境来更改配置。 这样您将拥有两个OAuth 2.0环境一个用于开发另一个用于生产。 更少的单词更多的代码 克隆本教程的资源库并检出start分支。 git clone -b start https://github.com/oktadeveloper/okta-spring-microservices-docker-example.git 根pom.xml文件不是pom.xml 。 但是一次管理多个项目可能会有所帮助。 让我们看看里面 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdcom.okta.developer.docker_microservices/groupIdartifactIdparent-pom/artifactIdversion0.0.1-SNAPSHOT/versionpackagingpom/packagingnameparent-project/namemodulesmoduleschool-service/modulemoduleschool-ui/module /modules /project 这称为聚合项目因为它聚合子项目。 这对于在所有声明的模块上运行相同的Maven任务很有用。 这些模块无需将根模块用作父模块。 有两个模块可用学校服务和学校UI。 学校服务微服务 school-service目录包含一个Spring Boot项目该项目充当项目的持久层和业务规则。 在更复杂的情况下您将拥有更多这样的服务。 该项目是使用始终出色的Spring Initializr创建的并具有以下配置 组– com.okta.developer.docker_microservices 神器– school-service 依赖关系– JPAWebLombokH2 您可以阅读PostgreSQLFlyway和JSONB的Spring Boot以获得有关此项目的更多详细信息。 总而言之它具有实体TeachingClass Course, Student并使用TeachingClassServiceDB和TeachingClassController通过REST API公开一些数据。 要测试它请打开一个终端导航到school-service目录然后运行以下命令 ./mvnw spring-boot:run 该应用程序将从端口8081 在文件school-service/src/main/resources/application.properties 启动因此您应该能够导航到http://localhost:8081并查看返回的数据。 curl http://localhost:8081 [{classId:13,teacherName:Profesor Jirafales,teacherId:1,courseName:Mathematics,courseId:3,numberOfStudents:2,year:1988},{classId:14,teacherName:Profesor Jirafales,teacherId:1,courseName:Spanish,courseId:4,numberOfStudents:2,year:1988},{classId:15,teacherName:Professor X,teacherId:2,courseName:Dealing with unknown,courseId:5,numberOfStudents:2,year:1995},{classId:16,teacherName:Professor X,teacherId:2,courseName:Dealing with unknown,courseId:5,numberOfStudents:1,year:1996} ]基于Spring的School UI微服务 顾名思义学校UI是利用学校服务的用户界面。 它是使用Spring Initializr使用以下选项创建的 组– com.okta.developer.docker_microservices 神器– school-ui 依存关系-网络仇恨胸腺Lombok UI是一个单独的网页列出了数据库上可用的类。 为了获取信息它通过文件school-ui/src/main/resources/application.properties的配置与school-service连接。 service.hostlocalhost:8081 SchoolController类具有查询服务的所有逻辑 package com.okta.developer.docker_microservices.ui.controller;import com.okta.developer.docker_microservices.ui.dto.TeachingClassDto; import org.springframework.beans.factory.annotation.*; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.*; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.*; import org.springframework.web.client.RestTemplate; import org.springframework.web.servlet.ModelAndView; import java.util.List;Controller RequestMapping(/) public class SchoolController {private final RestTemplate restTemplate;private final String serviceHost;public SchoolController(RestTemplate restTemplate, Value(${service.host}) String serviceHost) {this.restTemplate restTemplate;this.serviceHost serviceHost;}RequestMapping()public ModelAndView index() {return new ModelAndView(index);}GetMapping(/classes)public ResponseEntityListTeachingClassDto listClasses(){return restTemplate.exchange(http:// serviceHost /class, HttpMethod.GET, null,new ParameterizedTypeReferenceListTeachingClassDto() {});} } 如您所见该服务有一个硬编码的位置。 您可以使用-Dservice.hostlocalhost:9090这样的环境变量来更改属性设置。 尽管如此它仍必须手动定义。 如何拥有许多学校服务申请实例 在当前阶段不可能。 启用school-service后 启动school-ui 并在浏览器中浏览至http://localhost:8080 ./mvnw spring-boot:run 您应该看到如下页面 使用Spring Cloud和Eureka构建发现服务器 现在您有了一个可以使用的服务该应用程序使用两种服务将信息提供给最终用户。 怎么了 在现代应用程序中开发人员或操作通常不知道应用程序可能部署在何处或在哪个端口上。 部署应该是自动化的以便没有人关心服务器名称和物理位置。 除非您在数据中心内工作。否则希望您在意 但是必须有一个工具来帮助服务发现其对应对象。 有许多可用的解决方案对于本教程我们将使用Netflix的Eureka 因为它具有出色的Spring支持。 返回start.spring.io并创建一个新项目如下所示 组 com.okta.developer.docker_microservices 神器 discovery 依赖项Eureka Server 编辑主DiscoveryApplication.java类以添加EnableEurekaServer批注 package com.okta.developer.docker_microservices.discovery;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;SpringBootApplication EnableEurekaServer public class DiscoveryApplication {public static void main(String[] args) {SpringApplication.run(DiscoveryApplication.class, args);} } 并且您需要更新其application.properties文件使其在端口8761上运行并且不会尝试向其自身注册。 spring.application.namediscovery-server server.port8761 eureka.client.register-with-eurekafalse eureka.client.fetch-registryfalse 让我们定义每个属性 spring.application.name –应用程序的名称发现服务也使用它来发现服务。 您会看到其他所有应用程序也都有一个应用程序名称。 server.port –服务器正在运行的端口。 Eureka服务器的默认端口8761 。 eureka.client.register-with-eureka –告诉Spring不要将自己注册到发现服务中。 eureka.client .fetch-registry –指示该实例不应从服务器获取发现信息。 现在运行并访问http://localhost:8761 。 ./mvnw spring-boot:run 上面的屏幕显示了准备注册新服务的Eureka服务器。 现在该更改学校服务和学校用户界面以使用它了。 注意如果在启动时收到ClassNotFoundException: javax.xml.bind.JAXBContext错误那是因为您在Java 11上运行。您可以将JAXB依赖项添加到pom.xml以解决此问题。 dependencygroupIdjavax.xml.bind/groupIdartifactIdjaxb-api/artifactIdversion2.3.1/version /dependency dependencygroupIdorg.glassfish.jaxb/groupIdartifactIdjaxb-runtime/artifactIdversion2.3.2/version /dependency使用服务发现在微服务之间进行通信 首先添加所需的依赖关系很重要。 将以下内容添加到pom.xml文件中在school-service和school-ui项目中 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-netflix-eureka-client/artifactId /dependency 该模块是Spring Cloud计划的一部分因此需要一个新的依赖关系管理节点如下所示不要忘记将其添加到两个项目中 dependencyManagementdependenciesdependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring-cloud.version}/versiontypepom/typescopeimport/scope/dependency/dependencies /dependencyManagement 现在您需要配置两个应用程序以向Eureka注册。 在两个项目的application.properties文件中添加以下行 eureka.client.serviceUrl.defaultZone${EUREKA_SERVER:http://localhost:8761/eureka} spring.application.nameschool-service 不要忘了应用程序的名称从改变school-service于school-ui在学校的UI项目。 注意第一行中有一种新的参数 {EUREKA_SERVER:http://localhost:8761/eureka} 。 这意味着“如果环境变量EUREKA_SERVER存在请使用其值否则请使用默认值。” 这在以后的步骤中将很有用。 ; 你知道吗 两个应用程序都准备好将自己注册到发现服务中。 您无需执行任何其他操作。 我们的主要目标是学校用户界面项目不需要知道学校服务在哪里 。 因此您需要更改SchoolController 在school-ui项目中以在其REST端点中使用school-service 。 您也可以在此类中删除serviceHost变量。 package com.okta.developer.docker_microservices.ui.controller;import com.okta.developer.docker_microservices.ui.dto.TeachingClassDto; import org.springframework.core.ParameterizedTypeReference; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.client.RestTemplate; import org.springframework.web.servlet.ModelAndView;import java.util.List;Controller RequestMapping(/) public class SchoolController {private final RestTemplate restTemplate;public SchoolController(RestTemplate restTemplate) {this.restTemplate restTemplate;}RequestMapping()public ModelAndView index() {return new ModelAndView(index);}GetMapping(/classes)public ResponseEntityListTeachingClassDto listClasses() {return restTemplate.exchange(http://school-service/classes, HttpMethod.GET, null,new ParameterizedTypeReferenceListTeachingClassDto() {});} } 在集成Eureka之前您已经进行了配置指出了学校服务的位置。 现在您已将服务调用更改为使用其他服务使用的名称无端口无主机名。 您需要的服务就在某处您无需知道在哪里。 学校服务可能具有的多个实例并且最好在这些实例之间进行负载均衡负载。 幸运的是Spring有一个简单的解决方案在创建RestTemplate bean时如下所示添加LoadBalanced批注。 每当您向服务器提出问题时Spring都会管理多个实例调用。 package com.okta.developer.docker_microservices.ui;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; import org.springframework.web.servlet.config.annotation.*;SpringBootApplication public class UIWebApplication implements WebMvcConfigurer {public static void main(String[] args) {SpringApplication.run(UIWebApplication.class, args);}BeanLoadBalancedpublic RestTemplate restTemplate() {return new RestTemplate();}Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {if(!registry.hasMappingForPattern(/static/**)) {registry.addResourceHandler(/static/**).addResourceLocations(classpath:/static/, classpath:/static/js/);}} } 现在开始重新启动school-service和school-ui 并保持Discovery服务启动。 再次快速浏览一下http://localhost:8761 现在您的服务正在与Discovery服务器共享信息。 您可以再次测试该应用程序然后查看它是否可以正常运行。 只需在您喜欢的浏览器中转到http://localhost:8080 。 将配置服务器添加到您的微服务架构 尽管此配置有效但最好删除项目源代码中任何配置值的痕迹。 首先配置URL已从项目中删除并由服务进行管理。 现在您可以使用Spring Cloud Config对项目中的每个配置执行类似的操作。 首先使用Spring Initializr和以下参数创建配置项目 组 com.okta.developer.docker_microservices 工件 config 依赖项配置服务器Eureka发现 在主类中添加EnableConfigServer package com.okta.developer.docker_microservices.config;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.config.server.EnableConfigServer;SpringBootApplication EnableConfigServer public class ConfigApplication {... } 在项目的application.properties添加以下属性和值 spring.application.nameCONFIGSERVER server.port8888 spring.profiles.activenative spring.cloud.config.server.native.searchLocations. eureka.client.serviceUrl.defaultZone${EUREKA_SERVER:http://localhost:8761/eureka} 有关属性的一些解释 spring.profiles.activenative表示Spring Cloud Config必须使用本机文件系统来获取配置。 通常使用Git存储库但是为了简单起见我们将坚持使用本机文件系统。 spring.cloud.config.server.native.searchLocations –包含配置文件的路径。 如果将其更改为硬盘驱动器上的特定文件夹请确保并在其中创建school-ui.properties文件。 现在您需要一些配置和适用于此示例。 Okta的配置如何 让我们将school-ui放在授权层后面并使用配置项目提供的属性值。 您可以注册一个永久免费的开发人员帐户 该帐户使您可以创建所需使用的尽可能多的用户和应用程序 创建帐户后在Okta的信息中心中创建一个新的Web应用程序“ 应用程序” “ 添加应用程序” 并用以下值填写下一个表格 该页面将为您返回一个应用程序ID和一个密钥。 确保安全然后在config项目的根文件夹中创建一个名为school-ui.properties的文件内容如下。 不要忘记填充变量值 okta.oauth2.issuerhttps://{yourOktaDomain}/oauth2/default okta.oauth2.clientId{yourClientId} okta.oauth2.clientSecret{yourClientSecret} 现在运行config项目并检查其是否正确获取了配置数据 ./mvnw spring-boot:runcurl http://localhost:8888/school-ui.properties okta.oauth2.clientId: YOUR_CLIENT_ID okta.oauth2.clientSecret: YOUR_CLIENT_SECRET okta.oauth2.issuer: https://YOUR_DOMAIN/oauth2/default更改School UI以使用Spring Cloud Config和OAuth 2.0 现在您需要对Spring UI项目进行一些更改。 首先您需要更改school-ui/pom.xml并添加一些新的依赖项 dependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-config/artifactId /dependency dependencygroupIdcom.okta.spring/groupIdartifactIdokta-spring-boot-starter/artifactIdversion1.1.0/version /dependency dependencygroupIdorg.thymeleaf.extras/groupIdartifactIdthymeleaf-extras-springsecurity5/artifactId /dependency 在com.okta...ui.config包中创建一个新的SecurityConfiguration类 package com.okta.developer.docker_microservices.ui;import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;Configuration EnableGlobalMethodSecurity(prePostEnabled true) public class SpringSecurityConfiguration extends WebSecurityConfigurerAdapter {Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers(/).permitAll().anyRequest().authenticated().and().logout().logoutSuccessUrl(/).and().oauth2Login();} } 更改您的SchoolController以便仅允许具有范围profile用户使用每位经过身份验证的用户都拥有。 import org.springframework.security.access.prepost.PreAuthorize;....GetMapping(/classes) PreAuthorize(hasAuthority(SCOPE_profile)) public ResponseEntityListTeachingClassDto listClasses(){return restTemplate.exchange(http://school-service/class, HttpMethod.GET, null,new ParameterizedTypeReferenceListTeachingClassDto() {}); } 一些配置需要在项目启动时定义。 Spring有一个聪明的解决方案可以在上下文启动之前正确定位并提取配置数据。 您需要创建一个文件src/main/resources/bootstrap.yml如下所示 eureka:client:serviceUrl:defaultZone: ${EUREKA_SERVER:http://localhost:8761/eureka} spring:application:name: school-uicloud:config:discovery:enabled: trueservice-id: CONFIGSERVER 引导文件会创建一个预启动的Spring Application Context用于在实际应用程序启动之前提取配置。 您需要将所有属性从application.properties移到该文件因为Spring需要知道Eureka Server的位置以及如何搜索配置。 在上面的示例中您启用了通过发现服务进行配置 spring.cloud.config.discovery.enabled 并指定了配置service-id 。 更改application.properties文件使其仅具有一个OAuth 2.0属性 okta.oauth2.redirect-uri/authorization-code/callback 最后一个要修改的文件是src/main/resources/templates/index.hml 。 对其进行调整以在用户未通过身份验证时显示登录按钮在用户登录时显示注销按钮。 !doctype html html langen xmlns:thhttp://www.thymeleaf.org head!-- Required meta tags --meta charsetutf-8meta nameviewport contentwidthdevice-width, initial-scale1, shrink-to-fitno!-- Bootstrap CSS --link relstylesheet hrefhttps://stackpath.bootstrapcdn.com/bootstrap/4.1.3/css/bootstrap.min.css integritysha384-MCw98/SFnGE8fJT3GXwEOngsV7Zt27NXFoaoApmYm81iuXoPkFOJwJ8ERdknLPMO crossoriginanonymoustitleHello, world!/title /head body nav classnavbar navbar-defaultform methodpost th:action{/logout} th:if${#authorization.expression(isAuthenticated())} classnavbar-form navbar-rightinput typehidden th:name${_csrf.parameterName} th:value${_csrf.token} /button idlogout-button typesubmit classbtn btn-dangerLogout/button/formform methodget th:action{/oauth2/authorization/okta} th:unless${#authorization.expression(isAuthenticated())}button idlogin-button classbtn btn-primary typesubmitLogin/button/form /navdiv idcontent th:if${#authorization.expression(isAuthenticated())}h1School classes/h1table idclassestheadtrthCourse/ththTeacher/ththYear/ththNumber of students/th/tr/theadtbody/tbody/table!-- Optional JavaScript --!-- jQuery first, then Popper.js, then Bootstrap JS --script srchttps://code.jquery.com/jquery-3.3.1.min.js crossoriginanonymous/scriptscript srchttps://cdnjs.cloudflare.com/ajax/libs/popper.js/1.14.3/umd/popper.min.js integritysha384-ZMP7rVo3mIykV29J3UJ46jBk0WLaUAdn689aCwoqbBJiSnjAK/l8WvCWPIPm49 crossoriginanonymous/scriptscript srchttps://stackpath.bootstrapcdn.com/bootstrap/4.1.3/js/bootstrap.min.js integritysha384-ChfqqxuZUCnJSK3MXmPNIyE6ZbWh2IMqE241rYiqJxyMiZ6OW/JmZQ5stwEULTy crossoriginanonymous/scriptscript srcstatic/js/school_classes.js/script /div/body /html 您应该在此HTML中了解一些Thymeleaf属性 {/logout} –返回在后端定义的注销URL th:if${#authorization.expression(isAuthenticated())} –仅在用户登录时打印HTML {//oauth2/authorization/okta} –这是Spring Security重定向到Okta的URL。 您也可以链接到/login 但这只是呈现相同的链接您必须单击它。 th:unless${#authorization.expression(isAuthenticated())} –仅在用户注销后才在节点内打印HTML 现在重新启动配置项目和school-ui。 如果导航到输入http://localhost:8080 则应该看到以下屏幕 登录后屏幕应显示如下 恭喜您已经使用Spring Cloud config和Eureka创建了微服务架构来进行服务发现 现在让我们更进一步并对每个服务进行Dockerize。 使用Docker打包Spring应用程序 Docker是一项了不起的技术它允许创建类似于虚拟机的系统映像但是共享与主机操作系统相同的内核。 此功能可以提高系统性能和启动时间。 此外Docker提供了一个精巧的内置系统该系统可确保一旦创建映像就可以 它永远不会改变。 换句话说不再有“它可以在我的机器上工作” 提示需要更深的Docker背景吗 看看我们的《 Docker开发人员指南》 。 您需要为每个项目创建一个Docker映像。 每个映像在每个项目的根文件夹中应具有相同的Maven配置和Dockerfile内容例如 school-ui/Dockerfile 。 在每个项目的pom中添加dockerfile-maven-plugin plugins...plugingroupIdcom.spotify/groupIdartifactIddockerfile-maven-plugin/artifactIdversion1.4.9/versionexecutionsexecutioniddefault/idgoalsgoalbuild/goalgoalpush/goal/goals/execution/executionsconfigurationrepositorydeveloper.okta.com/microservice-docker-${project.artifactId}/repositorytag${project.version}/tagbuildArgsJAR_FILE${project.build.finalName}.jar/JAR_FILE/buildArgs/configuration/plugin /plugins 每次运行./mvnw install时此XML都会配置Dockerfile Maven插件以构建Docker映像。 将使用名称developer.okta.com/microservice-docker-${project.artifactId}创建每个图像其中project.artifactId因project.artifactId而异。 在每个项目的根目录中创建一个Dockerfile文件。 FROM openjdk:8-jdk-alpine VOLUME /tmp ADD target/*.jar app.jar ENV JAVA_OPTS ENTRYPOINT [ sh, -c, java $JAVA_OPTS -Djava.security.egdfile:/dev/./urandom -jar /app.jar Dockerfile遵循Spring Boot与Docker的建议。 现在更改school-ui/src/main/resources/bootstrap.yml以添加新的failFast设置 eureka:client:serviceUrl:defaultZone: ${EUREKA_SERVER:http://localhost:8761/eureka} spring:application:name: school-uicloud:config:discovery:enabled: trueserviceId: CONFIGSERVERfailFast: true spring.cloud.failFast: true设置告诉Spring Cloud Config在找不到配置服务器时立即终止应用程序。 这将对下一步很有用。 添加Docker Compose以运行所有内容 创建一个名为docker-compose.yml的新文件该文件定义每个项目的启动方式 version: 3 services:discovery:image: developer.okta.com/microservice-docker-discovery:0.0.1-SNAPSHOTports:- 8761:8761config:image: developer.okta.com/microservice-docker-config:0.0.1-SNAPSHOTvolumes:- ./config-data:/var/config-dataenvironment:- JAVA_OPTS-DEUREKA_SERVERhttp://discovery:8761/eureka-Dspring.cloud.config.server.native.searchLocations/var/config-datadepends_on:- discoveryports:- 8888:8888school-service:image: developer.okta.com/microservice-docker-school-service:0.0.1-SNAPSHOTenvironment:- JAVA_OPTS-DEUREKA_SERVERhttp://discovery:8761/eurekadepends_on:- discovery- configschool-ui:image: developer.okta.com/microservice-docker-school-ui:0.0.1-SNAPSHOTenvironment:- JAVA_OPTS-DEUREKA_SERVERhttp://discovery:8761/eurekarestart: on-failuredepends_on:- discovery- configports:- 8080:8080 如您所见每个项目现在都是Docker中声明的服务用于组成文件。 它将暴露其端口和其他一些属性。 除发现外所有项目都将具有变量值-DEUREKA_SERVERhttp://discovery:8761/eureka 。 这将告诉您在哪里可以找到发现服务器。 Docker Compose在服务之间创建一个虚拟网络每个服务使用的DNS名称就是其名称这就是为什么可以将discovery用作主机名的原因。 Config服务将具有用于配置文件的卷。 该卷将映射到docker容器内的/var/config-data 。 同样属性spring.cloud.config.server.native.searchLocations将被覆盖为相同的值。 您必须将文件school-ui.properties存储在卷映射上指定的同一文件夹中在上面的示例中 相对文件夹./config-data 。 school-ui项目的属性将restart: on-failure 。 这将Docker Compose设置为在应用程序失败后立即重新启动。 与failFast属性一起使用可以使应用程序继续尝试启动直到Discovery和Config项目完全准备好为止。 就是这样 现在构建图像 cd config ./mvnw clean install cd ../discovery ./mvnw clean install cd .. ./mvnw clean install 在school-ui项目中最后一个命令可能会失败并显示以下错误 java.lang.IllegalStateException: Failed to load ApplicationContext Caused by: java.lang.IllegalStateException: No instances found of configserver (CONFIGSERVER) 要解决此问题请创建一个school-ui/src/test/resources/test.properties文件并添加属性以使Okta的配置通过并且在测试时不使用发现或配置服务器。 okta.oauth2.issuerhttps://{yourOktaDomain}/oauth2/default okta.oauth2.clientIdTEST spring.cloud.discovery.enabledfalse spring.cloud.config.discovery.enabled false spring.cloud.config.enabled false 然后修改UIWebApplicationTests.java以加载此文件以用于测试属性 import org.springframework.test.context.TestPropertySource;... TestPropertySource(locationsclasspath:test.properties) public class UIWebApplicationTests {... } 现在您应该能够在school-ui项目中运行./mvnw clean install 。 完成后运行Docker Compose以启动所有容器在docker-compose.yml所在的目录中。 docker-compose up -d Starting okta-microservice-docker-post-final_discovery_1 ... done Starting okta-microservice-docker-post-final_config_1 ... done Starting okta-microservice-docker-post-final_school-ui_1 ... done Starting okta-microservice-docker-post-final_school-service_1 ... done 现在您应该能够像以前一样浏览该应用程序。 使用Spring配置文件来修改您的微服务的配置 现在您已经到达了微服务之旅的最后阶段。 Spring Profiles是一个功能强大的工具。 使用配置文件可以通过完全注入不同的依赖项或配置来修改程序行为。 假设您有一个结构良好的软件其持久层与业务逻辑分离。 例如您还提供对MySQL和PostgreSQL的支持。 每个数据库可能有不同的数据访问类这些数据访问类仅由定义的概要文件加载。 另一个用例是配置不同的配置文件可能具有不同的配置。 以身份验证为例。 您的测试环境会进行身份验证吗 如果是这样则不应使用与生产相同的用户目录。 将您的配置项目更改为在Okta中有两个应用程序一个默认用于开发另一个用于生产。 在Okta网站上创建一个新的Web应用程序并将其命名为“ okta-docker-production”。 现在在您的config项目中创建一个名为school-ui-production.properties的新文件。 您已经有了school-ui.properties 每个School UI实例都将使用它。 在文件末尾添加环境时Spring将合并两个文件并优先于最特定的文件。 使用生产应用程序的客户端ID和密码保存文件如下所示 school-ui-production.properties okta.oauth2.clientId{YOUR_PRODUCTION_CLIENT_ID} okta.oauth2.clientSecret{YOUR_PRODUCTION_CLIENT_SECRET} 现在使用Maven运行配置项目然后运行以下两个curl命令 ./mvnw spring-boot:run curl http://localhost:8888/school-ui.propertiesokta.oauth2.issuer: https://{yourOktaDomain}/oauth2/default okta.oauth2.clientId: YOUR DEV CLIENT ID HERE okta.oauth2.clientSecret: YOUR DEV CLIENT SECRET HERE curl http://localhost:8888/school-ui-production.properties okta.oauth2.issuer: https://{yourOktaDomain}/oauth2/default okta.oauth2.clientId: YOUR PROD CLIENT ID HERE okta.oauth2.clientSecret: YOUR PROD CLIENT SECRET HERE 如您所见即使文件school-ui-production具有两个属性 config项目也会显示三个属性因为配置已合并。 现在您可以在docker-compose.yml中将school-ui服务docker-compose.yml为使用production配置文件 school-ui:image: developer.okta.com/microservice-docker-school-ui:0.0.1-SNAPSHOTenvironment:- JAVA_OPTS-DEUREKA_SERVERhttp://discovery:8761/eureka-Dspring.profiles.activeproductionrestart: on-failuredepends_on:- discovery- configports:- 8080:8080 您还需要将school-ui-production.properties复制到您的config-data目录中。 然后关闭所有Docker容器并重新启动它们。 docker-compose down docker-compose up -d 您应该在school-ui容器的日志中看到以下内容 The following profiles are active: production 而已 现在您可以在生产配置文件中运行微服务架构。 头晕 提示如果要证明使用了okta-docker-production应用程序而不是okta-docker 可以在Okta中停用okta-docker应用程序并确认您仍然可以登录http://localhost:8080 。 了解有关微服务SpringDocker和现代应用程序安全性的更多信息 在这篇文章中您了解了有关微服务以及如何部署它们的更多信息以及 什么是微服务 服务应该如何发现其依赖关系而无需事先知道它们的位置。 如何以信息的中心点维护分布式配置。 该配置可以管理一个或多个应用程序和环境。 如何使用Spring Cloud Config配置OAuth 2.0。 如何使用Docker和Docker Compose部署微服务 如何使用Spring Profiles在生产环境中进行部署。 您可以在oktadeveloper / okta-spring-microservices-docker-example上的GitHub上找到本教程的完整源代码。 如果您有兴趣在Spring中学习有关微服务或现代应用程序开发的更多信息建议您查看以下资源 使用Spring Boot 2.0和OAuth 2.0构建并保护微服务 使用JHipster和OAuth 2.0开发微服务架构 使用Spring Boot为Microbrews构建微服务架构 Spring Boot 2.1出色的OIDCOAuth 2.0和反应式API支持 使用Spring Boot和MongoDB构建一个反应式应用程序 如果您对此帖子有任何疑问请在下面发表评论。 您可以在Twitter上关注oktadev以获取更多精彩内容 Build Spring Microservices和Dockerize Them for Production最初于2019年2月28日发布在Okta开发者博客上。 “我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕 尝试使用Okta API进行托管身份验证授权和多因素身份验证。 翻译自: https://www.javacodegeeks.com/2019/04/build-spring-microservices-dockerize-production.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910052.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

万家灯火营销型网站建设网站的会计分录

在 Oracle 数据库中,如果你想要比较 DATE 类型的时间部分,你需要意识到 DATE 类型实际上包含日期和时间信息,精确到秒。但是,由于 DATE 类型没有单独的时间组件,你通常需要一些额外的逻辑来提取或比较时间部分。 以下…

用腾讯云做淘宝客购物网站视频软件界面设计app

4.6高级处理-缺失值处理 点击标题即可获取文章源代码和笔记 数据集:https://download.csdn.net/download/weixin_44827418/12548095 Pandas高级处理缺失值处理数据离散化合并交叉表与透视表分组与聚合综合案例4.6 高级处理-缺失值处理1)如何进行缺失值处…

百度营销-网站分析培训建筑设计网站

教程介绍 学习信息收集,针对域名信息,解析信息,网站信息,服务器信息等;学习端口扫描,针对端口进行服务探针,理解服务及端口对应关系;学习WEB扫描,主要针对敏感文件,安全漏洞,子域名信息等;学习信息收集方法…

Codeforces 2127 D(图论,组合数学,DFS,分类讨论)

Codeforces 2127 D(图论,组合数学,DFS,分类讨论)Codeforces 2127 D D. Root was Built by Love, Broken by Destiny 题意: n栋房子,其中有m做桥分别连接两栋房子,然后把这些房子分别排列在南北两岸顺序不限,排列…

Java学习笔记:从三个实验看编程思维的锤炼

在石家庄铁道大学《Java语言程序设计》课程的学习过程中,我通过三个有趣的动手实验,不仅掌握了具体的语法知识,更深刻体会到编程思维的重要性。这些实验看似简单,却蕴含着程序设计中的深层原理。 枚举类型:从混沌…

完整教程:App 上架平台全解析,iOS 应用发布流程、苹果 App Store 审核步骤

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

视频网站用什么做的好处公司介绍网站模板

部署描述: 1.jenkins 通过maven编译成jar 项目包 2.shell 脚本从jenkins机器发布到:目标主机 注释:次脚本没有写jar包的备份,有时间加上 脚本内容: #!/bin/bash#线上服务器列表 HOST_LIST${:2}#项目名 REMOTE_PROJECT$…

h5创建网站网站推广专业术语

在现代化的电子产品中,音频功能的重要性日益凸显。无论是智能家居、玩具、医疗设备还是仪器仪表,富有吸引力的音效与语音提示都能显著提升用户体验。唯创知音WT2605C语音芯片MP3音频IC便是为了满足这一需求而诞生的,它具备指令随机播放、无缝…

移动端网站开发技术在北京注册公司要哪些条件

大多数WordPress站点都是个人博客网站,主要以文章性质的图文为主。不过部分站长想要用WordPress搭建一个产品展示站,应该怎么做呢? 其实,WordPress可以用来建立各种各样的博客网站,包括个人博客、企业网站、商城、影视…

旅游网站模块报价免费响应式企业网站源码

我是一名大专生,自19年通过校招进入湖南某软件公司以来,便扎根于功能测试岗位,一晃便是近四年的光阴。今年8月,我如梦初醒,意识到长时间待在舒适的环境中,已让我变得不思进取,技术停滞不前。更令…

石家庄网站网站建设wordpress文章编辑旧版

BOSHIDA DC电源模块检测故障步骤有哪些 DC电源模块检测故障步骤如下: 1. 检查输入电压:用万用表测量输入电压,确保其在规定范围内。 2. 检查输出电压:用万用表或示波器测量输出电压,确保其在规定范围内。 3. 检查输…

网站制作编辑软件ssp媒体服怎样做网站

linux中oops信息的调试及栈回溯【转】本文转载自:http://blog.csdn.net/kangear/article/details/8217329 ...linux 2.6 驱动笔记(一)本文作为linux 2.6 驱动笔记,记录环境搭建及linux基本内核模块编译加载. 环境搭建: 硬件:OK6410开发板 目标板操作系统:linux 2.6…

题解:AT_arc068_d [ARC068F] Solitaire

简单数数。 题意:很简单了,不再赘述。 做法: 首先我们考虑这个 deque 里面的数是什么样子的,发现一定是个谷型并且 \(1\) 是谷底,这个显然,那么就意味着,对于前 \(k-1\) 个位置是可以分成两个下降序列,然后 \(…

Codeforces Round 1051 (Div. 2) D1D2题解

D1. Inversion Graph Coloring (Easy Version) 题意: 给定一个序列 \(a_1, a_2, \ldots, a_n\),我们需要计算其“好”子序列的数量。一个子序列是“好”的,如果存在一种将它的索引染成红色或蓝色的方式,使得对于任…

网站备案名称中国开头选课网站开发

雷迪斯and the乡亲们 欢迎你们来到 奇幻的编程世界 17.wc命令 作用: 统计行数、单词数、字符分数 格式: wc 选项 文件 选项: -l: 统计行数 -w: 统计单词 -c :统计字符 例子: 162&…

每日报告-关于本学期的计划

每日报告-关于本学期的计划1.确定100人次的社会调研的主题 选题:你觉得市面上缺少哪种APP/你还需要什么APP

阿里云 ip 网站东莞网站seo优化托管

1、简单介绍 继前面发布的 GroundingDino 和 Open-GroundingDino的推理 和 Open-GroundingDino的训练实现,作为 GroundingDino延续性的文本检测网络 MM-Grounding-DINO 也发布了较详细的 训练和推理实现教程,而且操作性很强。作为学习内容,也…

青海建设厅报名网站基于html5的网站开发

Shell 教程 Shell 是一个用 C 语言编写的程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言。 Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。 Ke…

长春建站最新消息经典营销案例分析

-Xms256m -Xmx256m -XX:MaxPermSize64m 如果 jvm 启动失败, 说堆内存不够, 需要调小 初始堆和最大堆大小, 持久代大小; 第一行的参数是调节后的vm参数荔枝 ;

网站免费正能量小说家用电脑做网站后台

一、前言各位小伙伴们还有几天新的一年即将来临,这篇文章作为今年的结束吧。不知道大家对自己每一年的技术发展规划是什么,我在这里分享一下我2021年的新的规划,这里非常感谢各位小伙伴对我的关注。二、内容概要2021的布局客户端技术分享服务…