场景
SpringCloud分布式微服务项目搭建构造父子模块依赖与实现服务提供者与消费者示例:
SpringCloud分布式微服务项目搭建构造父子模块依赖与实现服务提供者与消费者示例_霸道流氓气质的博客-CSDN博客
SpringCloud分布式微服务项目Common通用依赖模块抽离:
SpringCloud分布式微服务项目Common通用依赖模块抽离_霸道流氓气质的博客-CSDN博客
在上面搭建项目结构基础上,首先是实现了单机模式下集成Eureka。
SpringCloud中集成Eureka实现服务注册(单机Eureka构建):
SpringCloud中集成Eureka实现服务注册(单机Eureka构建)_霸道流氓气质的博客-CSDN博客
Eureka集群原理
微服务RPC远程服务调用最核心的是高可用,如果注册中心只有一个,如果除了故障,会导致整个服务环境不可用。
Eureka集群的实现原理就是互相注册,相互守望。
注:
博客: 霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主 关注公众号 霸道的程序猿 获取编程相关电子书、教程推送与免费下载。
实现
1、参考上面搭建7001Eureka服务注册中心的过程,再新建一个子模块7002
与7001一样,pom文件中添加eureka-server的依赖
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
新建主启动类EurekaMain7002并添加注解@EnableEurekaServer
package com.badao.springclouddemo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7002 {
public static void main(String[] args){
SpringApplication.run(EurekaMain7002.class,args);
}
}
2、修改hosts文件
注意与之前单机模式下不同,在配置文件中配置eureka服务端的实例名称时如果再一台电脑下避免出现重复问题,
所以修改C:\Windows\System32\drivers\etc下的hosts文件
添加如下
127.0.0.1 eureka7001.com 127.0.0.1 eureka7002.com
使本机ip能映射出两个域名。
3、修改配置文件application.yml
修改Eureka Server7001的application.yml,配置eureka服务端的实例名称为eureka7001.com
并且将其service-url下的defaultZone指向其它eureka,这里将其指向7002
server:
port: 7001
eureka:
instance:
hostname: eureka7001.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#集群指向其它eureka
defaultZone: http://eureka7002.com:7002/eureka/
上面讲的集群搭建就是相互注册,相互守望,如果是搭建了三个集群,则1指向2和3,2指向1和3这种类推。
然后新建并修改Eureka Server7002的application.yml,配置其eureka服务端的实例名称为eureka7002.com
然后将其指向7001
server:
port: 7002
eureka:
instance:
hostname: eureka7002.com #eureka服务端的实例名称
client:
register-with-eureka: false #false表示不向注册中心注册自己。
fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
service-url:
#集群指向其它eureka
defaultZone: http://eureka7001.com:7001/eureka/
4、修改服务注册的服务提供者和服务消费者的注册方式
前面单机模式下,服务注册的方式是在application.yml中指向一个Eureka Server,现在集群模式下,需要将其
修改为注册到多个Eureka Server中
修改服务提供者8001的配置文件
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true。
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
#单机版
#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
同样修改服务消费者88的配置文件
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true。
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
#单机
#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
5、测试效果
分别启动Eureka Server7001和7002,然后启动服务提供者8001和服务消费者88服务
访问
http://eureka7001.com:7001/
可以看到和7002互为守望,服务注册者和消费者也已经注册成功。
再访问
http://eureka7002.com:7002/
可以看到和7001互为守望,服务注册者和消费者也已经注册成功。
6、服务提供者集群搭建
通过上面实现了Eureka Server 集群的搭建,那么如果服务提供者也是只有一个的话,一旦宕机,也达不到集群的目的。
所以对于服务提供者同样也需要进行集群的搭建。
上面已经建立的服务提供者8001服务,参考其新建过程,复制一个一模一样只有端口为8002的服务
修改其pom文件中的依赖与8001一致
<dependencies>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency><!-- 引入自己定义的api通用包,可以使用Payment支付Entity -->
<groupId>com.badao</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</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>
<!--mysql-connector-java-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!--jdbc-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
新建并修改其yml,从8001复制并修改其端口号
server:
port: 8002
spring:
application:
name: cloud-payment-service
datasource:
type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver # mysql驱动包
url:jdbc:mysql://localhost:3306/springclouddemo?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true。
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetchRegistry: true
service-url:
#单机版
#defaultZone: http://localhost:7001/eureka
defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka
mybatis:
mapperLocations: classpath:mapper/*.xml
type-aliases-package: com.badao.springclouddemo.entities # 所有Entity别名类所在包
从8001复制主启动类并修改名称为8002
然后其他业务类均从8001复制到8002,使服务提供者具备8001和8002两个服务
为了后面能演示出消费者调用服务提供者时负载均衡的效果,在服务提供者的Controller中加入端口的输出
7、服务消费者修改负载均衡
之前在服务消费者88服务中调用服务提供者服务时,url是固定写死的,这种只适用于单机模式,显示服务提供者
已经搭建了集群,所以不能再写死服务提供者的地址了,而是要通过服务提供者的别名进行访问
这个别名可以在Eureka中获取
而服务的别名的设置是在服务提供者的配置文件中配置
消费者服务在调用服务时要支持负载均衡,需要在RestTemplate的配置中使用@LoadBalanced注解赋予负载均衡的能力。
package com.badao.springclouddemo.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig
{
@Bean
@LoadBalanced
public RestTemplate getRestTemplate()
{
return new RestTemplate();
}
}
8、测试集群搭建效果
启动7001和7002这两个Eureka Server,然后启动8001和8002这两个服务提供者,然后再启动88服务消费者
通过服务消费者访问服务提供者的服务,可以通过返回结果中的端口号看到负载均衡的效果
|