1. 新建cloud-eureka-server7002
<projectxmlns="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.atguigu.springcloud</groupId><artifactId>cloud2020</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>cloud-eureka-server7002</artifactId><packaging>jar</packaging><name>cloud-eureka-server7002</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.atguigu.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency></dependencies></project>server: port: 7002 #集群版 eureka: instance: hostname: eureka7002.com #eureka服务端的实例名字 client: register-with-eureka: false #表识不向注册中心注册自己 fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务 service-url: defaultZone: http://eureka7001.com:7001/eureka/注意:此时是eureka7002向eureka7001节点注册,此时的实例名称也不再是localhost,是为了在eureka集群之间好区分,所以实例名要保持不一致
1.1 改造eureka7001
server: port: 7001 # 单机版 eureka: instance: hostname: eureka7001.com #eureka服务端的实例名字 client: register-with-eureka: false #表示不向注册中心注册自己 fetch-registry: false #表示自己就是注册中心,职责是维护服务实例,并不需要去检索服务 service-url: #设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址 defaultZone: http://eureka7002.com:7002/eureka/注意:同样是修改实例名,以及注册方向
1.2 同时启动两台eureka节点
重要: eureka集群,之间是互相注册的关系,修改了本机host文件
2. 将payment,order服务注册进eureka集群
注意:将原先注册的单机配置改为集群配置即可
server:port:8001spring:application:name:cloud-payment-service datasource:type:com.alibaba.druid.pool.DruidDataSourcedriver-class-name:org.gjt.mm.mysql.Driverurl:jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername:root password:root druid:initial-size:5max-active:10min-idle:5max-wait:60000test-while-idle:truevalidation-query:SELECT1test-on-borrow:falsetest-on-return:falsetime-between-eviction-runs-millis:60000min-evictable-idle-time-millis:300000eureka:client:register-with-eureka:true#是否向注册中心注册自己 fetchRegistry:true#是否从注册中心抓取已有的注册信息 默认true,集群必须设置为trueservice-url:# defaultZone:http://localhost:7001/eureka #单机版 defaultZone:http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版 mybatis:mapper-locations:classpath:mapper/*.xml type-aliases-package: com.atguigu.springcloud.entitiesserver:port:80spring:application:name:cloud-order-service eureka:client:register-with-eureka:true#是否向注册中心注册自己 fetchRegistry:true#是否从注册中心抓取已有的注册信息 默认true,集群必须设置为trueservice-url:#设置与eureka server交互的地址查询服务和注册服务都需要依赖这个地址 # defaultZone:http://localhost:7001/eureka #单机版 defaultZone:http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版2.1 启动服务
3. payment集群配置
3.1 新增cloud-provider-payment8002 module
<projectxmlns="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.atguigu.springcloud</groupId><artifactId>cloud2020</artifactId><version>1.0-SNAPSHOT</version></parent><artifactId>cloud-provider-payment8002</artifactId><packaging>jar</packaging><name>cloud-provider-payment8002</name><url>http://maven.apache.org</url><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>com.atguigu.springcloud</groupId><artifactId>cloud-api-commons</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.10</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies></project>注意:pom.xml与payment8001保持一致
3.2 yml文件
server: port: 8002 spring: application: name: cloud-payment-service datasource: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: org.gjt.mm.mysql.Driver url: jdbc:mysql://localhost:3306/db2019?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root druid: initial-size: 5 max-active: 10 min-idle: 5 max-wait: 60000 test-while-idle: true validation-query: SELECT 1 test-on-borrow: false test-on-return: false time-between-eviction-runs-millis: 60000 min-evictable-idle-time-millis: 300000 eureka: client: register-with-eureka: true #是否向注册中心注册自己 fetchRegistry: true #是否从注册中心抓取已有的注册信息 默认true,集群必须设置为true service-url: # defaultZone: http://localhost:7001/eureka #单机版 defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka #集群版 mybatis: mapper-locations: classpath:mapper/*.xml type-aliases-package: com.atguigu.springcloud.entities注意:yml文件与payment8001保持一致,yml中的spring.application.name保持一致即可,注册在eureka集群中是一致的注意:因为是payment服务集群,因此两个服务的代码需要保持一致
4. 改造order80服务
注意:现在payment服务有两台机器,因此order服务再调用的时候,需要通过eureka去调用
packagecom.atguigu.springcloud.controller;importcom.atguigu.springcloud.entities.CommonResult;importcom.atguigu.springcloud.entities.Payment;importorg.springframework.web.bind.annotation.*;importorg.springframework.web.client.RestTemplate;importjavax.annotation.Resource;@RestController@RequestMapping("consumer")publicclassOrderController{//public static final String PAYMENT_URL = "http://localhost:8001";publicstaticfinalStringPAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";@ResourceprivateRestTemplaterestTemplate;@PostMapping("/payment/create")publicCommonResult<Payment>create(@RequestBodyPaymentpayment){returnrestTemplate.postForObject(PAYMENT_URL+"/payment/create",payment,CommonResult.class);}@GetMapping("/payment/get/{id}")publicCommonResult<Payment>getPayment(@PathVariable("id")Longid){returnrestTemplate.getForObject(PAYMENT_URL+"/payment/get/"+id,CommonResult.class);}@GetMapping("/payment/queryAllByLimit")publicCommonResultqueryAllByLimit(@RequestParam(defaultValue="0")intoffset,@RequestParam(defaultValue="10")intlimit){returnrestTemplate.getForObject(PAYMENT_URL+"/payment/queryAllByLimit?offset="+offset+"&limit="+limit,CommonResult.class);}}注意:将调用的url改为注册在eureka中的服务名
publicstaticfinalStringPAYMENT_URL="http://CLOUD-PAYMENT-SERVICE";注意:因为payment服务存在两个节点,因此order服务在调用的时候,需要配置轮询策略@LoadBalanced
packagecom.atguigu.springcloud.config;importorg.springframework.cloud.client.loadbalancer.LoadBalanced;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.client.RestTemplate;@ConfigurationpublicclassApplicationContextConfig{// 配置bean 不然后面没法依赖注入,就像以前ssm整合时配置依赖注入一样,// 需要在配置文件配置之后,代码中才可以依赖注入// 当前文件就是spring的配置文件@Bean@LoadBalanced//让这个RestTemplate在请求时拥有客户端负载均衡的能力publicRestTemplategetRestTemplate(){returnnewRestTemplate();}}