当前位置:   article > 正文

springcloud(1)—— eureka本地集群搭建以及实现微服务的负载均衡调用_本地eureka

本地eureka

什么是服务治理?
Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务治理
在传统的rpc远程调用框架中,管理每个服务与服务之间依赖关系比较复杂,所以需要使用服务治理,管理服务与服务之间依赖关系,可以实现服务调用、负载均衡、容错等,实现服务发现与注册!

什么是服务注册与发现
Eureka采用了CS的设计架构,Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka的客户端连接到 Eureka Server并维持心
跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个服务是否正常运行。
在服务注册与发现中,有一个注册中心,当服务器启动的时候,会把当前自己服务器的信息比如服务地址、通讯地址等以别名方式注册到注册中心上。另一方 (消费者|服务提供
者) ,以该别名的方式去注册中心上获取到实际的服务通讯地址,然后再实现本地RPC调用。RPC远程调用框架核心设计思想: 在于注册中心,因为使用注册中心管理每个服务与
服务之间的一个依赖关系(服务治理概念)。在任何rpc远程框架中,都会有一个注册中心(存放服务地址相关信息(接口地址)) 

在这里插入图片描述

Eureka包含两个组件: Eureka Server和Eureka Client
Eureka Server提供服务注册服务:
各个微服务节点通过配置启动后,会在EurekaServer中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观看到。


EurekaClient通过注册中心进行访问:
是一个Java客户端,用于简化Eureka Server的交互,客户端同时也具备一个内置的、使用轮询(round-robinm)负载算法的负载均衡器。在应用启动后,将会向Eureka Server发送心跳默认周期为30秒。如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,EurekaServer将会从服务注册表中把这个服务节点移除 (默认90秒)。

我们直接利用eureka搭建一个服务注册与发现的集群,实现一个微服务调用的的功能

1、新建一个maven父工程(springcloud)

  1. <!--统一管理jar包版本-->
  2. <properties>
  3. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  4. <maven.compiler.source>1.8</maven.compiler.source>
  5. <maven.compiler.target>1.8</maven.compiler.target>
  6. <junit.version>4.12</junit.version>
  7. <lombok.version>1.18.10</lombok.version>
  8. <log4j.version>1.2.12</log4j.version>
  9. <mysql.version>8.0.18</mysql.version>
  10. <druid.version>1.1.10</druid.version>
  11. <mybatis.spring.boot.version>1.3.2</mybatis.spring.boot.version>
  12. </properties>
  13. <!--子模块继承之后,提供作用:锁定版本+子module不用写groupId和version-->
  14. <dependencyManagement>
  15. <dependencies>
  16. <!--spring boot 2.2.2-->
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-dependencies</artifactId>
  20. <version>2.2.2.RELEASE</version>
  21. <type>pom</type>
  22. <scope>import</scope>
  23. </dependency>
  24. <!--spring cloud Hoxton.SR1-->
  25. <dependency>
  26. <groupId>org.springframework.cloud</groupId>
  27. <artifactId>spring-cloud-dependencies</artifactId>
  28. <version>Hoxton.SR1</version>
  29. <type>pom</type>
  30. <scope>import</scope>
  31. </dependency>
  32. <!--spring cloud alibaba-->
  33. <dependency>
  34. <groupId>com.alibaba.cloud</groupId>
  35. <artifactId>spring-cloud-alibaba-dependencies</artifactId>
  36. <version>2.1.0.RELEASE</version>
  37. <type>pom</type>
  38. <scope>import</scope>
  39. </dependency>
  40. <!--mysql-->
  41. <dependency>
  42. <groupId>mysql</groupId>
  43. <artifactId>mysql-connector-java</artifactId>
  44. <version>${mysql.version}</version>
  45. <scope>runtime</scope>
  46. </dependency>
  47. <!-- druid-->
  48. <dependency>
  49. <groupId>com.alibaba</groupId>
  50. <artifactId>druid-spring-boot-starter</artifactId>
  51. <version>${druid.version}</version>
  52. </dependency>
  53. <!--mybatis-->
  54. <dependency>
  55. <groupId>org.mybatis.spring.boot</groupId>
  56. <artifactId>mybatis-spring-boot-starter</artifactId>
  57. <version>${mybatis.spring.boot.version}</version>
  58. </dependency>
  59. <!--junit-->
  60. <dependency>
  61. <groupId>junit</groupId>
  62. <artifactId>junit</artifactId>
  63. <version>${junit.version}</version>
  64. </dependency>
  65. <!--log4j-->
  66. <dependency>
  67. <groupId>log4j</groupId>
  68. <artifactId>log4j</artifactId>
  69. <version>${log4j.version}</version>
  70. </dependency>
  71. </dependencies>
  72. </dependencyManagement>

2、创建3个eureka服务

(cloud-eureka-server7001、cloud-eureka-server7002、cloud-eureka-server7003)

主启动类:其他两个就不贴了

  1. @EnableEurekaServer //表示此项目是eureka的服务注册中心
  2. @SpringBootApplication
  3. public class EurekaMain7001 {
  4. public static void main(String[] args) {
  5. SpringApplication.run(EurekaMain7001.class, args);
  6. }
  7. }

pom.xml

  1. <dependencies>
  2. <!-- eureka-server -->
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  6. </dependency>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-web</artifactId>
  10. </dependency>
  11. <!--监控-->
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-actuator</artifactId>
  15. </dependency>
  16. <!-- 一般通用配置 -->
  17. <dependency>
  18. <groupId>org.springframework.boot</groupId>
  19. <artifactId>spring-boot-devtools</artifactId>
  20. <scope>runtime</scope>
  21. <optional>true</optional>
  22. </dependency>
  23. <dependency>
  24. <groupId>org.projectlombok</groupId>
  25. <artifactId>lombok</artifactId>
  26. <optional>true</optional>
  27. </dependency>
  28. <dependency>
  29. <groupId>org.springframework.boot</groupId>
  30. <artifactId>spring-boot-starter-test</artifactId>
  31. <scope>test</scope>
  32. </dependency>
  33. </dependencies>

application.yml 另外两个就不贴了,改下port和defaultZone

  1. server:
  2. port: 7001
  3. eureka:
  4. instance:
  5. hostname: eureka7001.com #eureka服务端的实例名称
  6. client:
  7. #false表示不向注册中心注册自己(想注册也可以,不过没必要)
  8. register-with-eureka: false
  9. #false表示自己端就是注册中心,职责就是维护服务实例,并不需要去检索服务
  10. fetch-reapplication.ymlgistry: false
  11. service-url:
  12. #设置与eurekaServer交互的地址查询服务和注册服务都需要依赖这个地址 单机
  13. #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
  14. #集群版 相互注册,相互守望
  15. defaultZone: http://eureka7002.com:7002/eureka/, http://eureka7003.com:7003/eureka/
  16. # defaultZone是固定写法,如果想自定义,需要按以下写法才行:
  17. # region: eureka-server
  18. # availability-zones:
  19. # eureka-server: server1,server2
  20. # service-url:
  21. # server1: http://eureka7002.com:7002/eureka/
  22. # server2: http://eureka7003.com:7003/eureka/
  23. server:
  24. #关闭自我保护,默认为true
  25. enable-self-preservation: false
  26. #心跳的间隔时间,单位毫秒
  27. eviction-interval-timer-in-ms: 2000

 修改下hosts文件:

 3、搭建消费者和服务者

3.1、创建实体中间件工程

cloud-api-commons

包路径为:

com.cjian.springcloud.bean
  1. public class CommonResult<T> {
  2. private Integer code;
  3. private String message;
  4. private T data;
  5. public CommonResult(Integer code, String message, T data) {
  6. this.code = code;
  7. this.message = message;
  8. this.data = data;
  9. }
  10. public CommonResult(Integer code, String message){
  11. this(code, message, null);
  12. }
  13. public CommonResult() {
  14. }
  15. public Integer getCode() {
  16. return code;
  17. }
  18. public void setCode(Integer code) {
  19. this.code = code;
  20. }
  21. public String getMessage() {
  22. return message;
  23. }
  24. public void setMessage(String message) {
  25. this.message = message;
  26. }
  27. public T getData() {
  28. return data;
  29. }
  30. public void setData(T data) {
  31. this.data = data;
  32. }
  33. }
  1. public class Payment implements Serializable {
  2. private Long id;
  3. private String serial;
  4. public Long getId() {
  5. return id;
  6. }
  7. public void setId(Long id) {
  8. this.id = id;
  9. }
  10. public String getSerial() {
  11. return serial;
  12. }
  13. public void setSerial(String serial) {
  14. this.serial = serial;
  15. }
  16. }

3.2、搭建两个服务提供者 

cloud-provider-payment8001、cloud-provider-payment8002
  1. <dependencies>
  2. <dependency>
  3. <groupId>org.springframework.cloud</groupId>
  4. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  5. </dependency>
  6. <dependency>
  7. <groupId>com.cjian.springloud</groupId>
  8. <artifactId>cloud-api-commons</artifactId>
  9. <version>${project.version}</version>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-web</artifactId>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.springframework.boot</groupId>
  17. <artifactId>spring-boot-starter-actuator</artifactId>
  18. </dependency>
  19. <dependency>
  20. <groupId>org.mybatis.spring.boot</groupId>
  21. <artifactId>mybatis-spring-boot-starter</artifactId>
  22. <version>1.3.2</version>
  23. </dependency>
  24. <!-- alibaba的druid数据库连接池 -->
  25. <dependency>
  26. <groupId>com.alibaba</groupId>
  27. <artifactId>druid-spring-boot-starter</artifactId>
  28. <version>1.1.10</version>
  29. </dependency>
  30. <!--mysql-connector-java-->
  31. <dependency>
  32. <groupId>mysql</groupId>
  33. <artifactId>mysql-connector-java</artifactId>
  34. <version>8.0.18</version>
  35. </dependency>
  36. <!--jdbc-->
  37. <dependency>
  38. <groupId>org.springframework.boot</groupId>
  39. <artifactId>spring-boot-starter-jdbc</artifactId>
  40. </dependency>
  41. <dependency>
  42. <groupId>org.springframework.boot</groupId>
  43. <artifactId>spring-boot-devtools</artifactId>
  44. <scope>runtime</scope>
  45. <optional>true</optional>
  46. </dependency>
  47. <dependency>
  48. <groupId>org.projectlombok</groupId>
  49. <artifactId>lombok</artifactId>
  50. <optional>true</optional>
  51. </dependency>
  52. <dependency>
  53. <groupId>org.springframework.boot</groupId>
  54. <artifactId>spring-boot-starter-test</artifactId>
  55. <scope>test</scope>
  56. </dependency>
  57. </dependencies>

application.yml

  1. server:
  2. port: 8001
  3. spring:
  4. application:
  5. name: cloud-payment-service
  6. datasource:
  7. type: com.alibaba.druid.pool.DruidDataSource # 当前数据源操作类型
  8. driver-class-name: com.mysql.cj.jdbc.Driver # mysql驱动包
  9. url: jdbc:mysql://127.0.0.1:3306/mysql?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
  10. username: root
  11. password: 123456
  12. mybatis:
  13. mapperLocations: classpath:mapper/*.xml
  14. type-aliases-package: com.cjian.springcloud.bean # 所有Entity别名类所在包
  15. eureka:
  16. client:
  17. register-with-eureka: true
  18. fetch-registry: true
  19. service-url:
  20. #defaultZone: http://localhost:7001/eureka
  21. defaultZone: http://eureka7001.com:7001/eureka,http://eureka7001.com:7002/eureka,http://eureka7001.com:7003/eureka
  22. instance:
  23. instance-id: payment8001
  24. prefer-ip-address: true #访问路径可以显示ip地址
  25. #Eureka客户端向服务端发送心跳的时间间隔,单位秒(默认30秒)
  26. lease-renewal-interval-in-seconds: 1
  27. #Eureka服务端在收到最后一次心跳后等待的时间上限,单位秒(默认90秒),超时剔除服务
  28. lease-expiration-duration-in-seconds: 2

包路径:com.cjian.springcloud

  1. @Mapper
  2. public interface PaymentDao {
  3. public int create(Payment payment);
  4. public Payment getPaymentById(@Param("id") Long id);
  5. }
  1. public interface PaymentService {
  2. public int create(Payment payment);
  3. public Payment getPaymentById(@Param("id") Long id);
  4. }
  1. @Service
  2. public class PaymentServiceImpl implements PaymentService {
  3. @Resource
  4. private PaymentDao paymentDao;
  5. public int create(Payment payment)
  6. {
  7. return paymentDao.create(payment);
  8. }
  9. public Payment getPaymentById(Long id)
  10. {
  11. return paymentDao.getPaymentById(id);
  12. }
  13. }
  1. @RestController
  2. public class PaymentController {
  3. @Resource
  4. private PaymentService paymentService;
  5. @Value("${server.port}")
  6. private String serverPort;
  7. @PostMapping(value = "/payment/create")
  8. public CommonResult create(@RequestBody Payment payment)
  9. {
  10. int result = paymentService.create(payment);
  11. System.out.println(("*****插入结果:" + result));
  12. if(result > 0)
  13. {
  14. return new CommonResult(200,"插入数据库成功,serverPort: "+serverPort,result);
  15. }else{
  16. return new CommonResult(444,"插入数据库失败",null);
  17. }
  18. }
  19. @GetMapping(value = "/payment/get/{id}")
  20. public CommonResult<Payment> getPaymentById(@PathVariable("id") Long id)
  21. {
  22. Payment payment = paymentService.getPaymentById(id);
  23. if(payment != null)
  24. {
  25. return new CommonResult(200,"查询成功,serverPort: "+serverPort,payment);
  26. }else{
  27. return new CommonResult(444,"没有对应记录,查询ID: "+id,null);
  28. }
  29. }
  30. }
  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
  3. <mapper namespace="com.cjian.springcloud.dao.PaymentDao">
  4. <resultMap id="BaseResultMap" type="com.cjian.springcloud.bean.Payment">
  5. <id column="id" property="id" jdbcType="BIGINT"/>
  6. <id column="serial" property="serial" jdbcType="VARCHAR"/>
  7. </resultMap>
  8. <insert id="create" parameterType="com.cjian.springcloud.bean.Payment" useGeneratedKeys="true" keyProperty="id">
  9. insert into payment(serial) values(#{serial});
  10. </insert>
  11. <select id="getPaymentById" parameterType="Long" resultMap="BaseResultMap">
  12. select * from payment where id=#{id};
  13. </select>
  14. </mapper>

主启动类:

这里

  1. @SpringBootApplication
  2. //@EnableEurekaClient 不加该注解也是可以的,下面分析eureka原理的时候再说
  3. public class PaymentMain001 {
  4. public static void main(String[] args) {
  5. SpringApplication.run(PaymentMain001.class, args);
  6. }
  7. }

建表sql:

  1. CREATE TABLE `payment`(
  2. `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'ID',
  3. `serial` varchar(200) DEFAULT '',
  4. PRIMARY KEY (id)
  5. )ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4

另一个服务提供者不做赘述~

3.3、搭建一个消费者 

cloud-consumer-order80 

  1. <dependencies>
  2. <!-- eureka-client -->
  3. <dependency>
  4. <groupId>org.springframework.cloud</groupId>
  5. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  6. </dependency>
  7. <dependency>
  8. <groupId>com.cjian.springloud</groupId>
  9. <artifactId>cloud-api-commons</artifactId>
  10. <version>1.0-SNAPSHOT</version>
  11. </dependency>
  12. <dependency>
  13. <groupId>org.springframework.boot</groupId>
  14. <artifactId>spring-boot-starter-web</artifactId>
  15. </dependency>
  16. <dependency>
  17. <groupId>org.springframework.boot</groupId>
  18. <artifactId>spring-boot-starter-actuator</artifactId>
  19. </dependency>
  20. <!--热部署-->
  21. <dependency>
  22. <groupId>org.springframework.boot</groupId>
  23. <artifactId>spring-boot-devtools</artifactId>
  24. <scope>runtime</scope>
  25. <optional>true</optional>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.projectlombok</groupId>
  29. <artifactId>lombok</artifactId>
  30. <optional>true</optional>
  31. </dependency>
  32. <dependency>
  33. <groupId>org.springframework.boot</groupId>
  34. <artifactId>spring-boot-starter-test</artifactId>
  35. <scope>test</scope>
  36. </dependency>
  37. </dependencies>

  1. @Configuration
  2. public class ApplicationContextConfig {
  3. //往容器中添加一个RestTemplate
  4. //RestTemplate提供了多种便捷访问远程http访问的方法
  5. @Bean
  6. @LoadBalanced//开启负载均衡功能
  7. public RestTemplate restTemplate(){
  8. return new RestTemplate();
  9. }
  10. }
  1. @RestController
  2. public class OrderController {
  3. // public static final String PAYMENT_URL = "http://localhost:8001";
  4. public static final String PAYMENT_URL = "http://CLOUD-PAYMENT-SERVICE";
  5. @Resource
  6. private RestTemplate restTemplate;
  7. //因为浏览器只支持get请求,为了方便这里就用get
  8. @GetMapping("/consumer/payment/create")
  9. public CommonResult<Payment> create(Payment payment){
  10. System.out.println("********插入的数据:" + payment);
  11. //postForObject分别有三个参数:请求地址,请求参数,返回的对象类型
  12. return restTemplate.postForObject(PAYMENT_URL + "/payment/create", payment, CommonResult.class);
  13. }
  14. @GetMapping("/consumer/payment/get/{id}")
  15. public CommonResult<Payment> getPayment(@PathVariable("id") Long id){
  16. System.out.println("********查询的id:" + id);
  17. //getForObject两个参数:请求地址,返回的对象类型
  18. return restTemplate.getForObject(PAYMENT_URL + "/payment/get/" + id, CommonResult.class);
  19. }
  20. }

 application.yml

  1. #访问一个网站时,默认是80端口,给用户80端口,用户就可以不用加端口直接访问页面
  2. server:
  3. port: 81
  4. spring:
  5. application:
  6. name: cloud-order-service
  7. eureka:
  8. client:
  9. register-with-eureka: true
  10. etch-registry: true
  11. service-url:
  12. #defaultZone: http://localhost:7001/eureka
  13. defaultZone: http://eureka7001.com:7001/eureka,http://eureka7001.com:7002/eureka,http://eureka7001.com:7003/eureka
  14. instance:
  15. instance-id: consumer81
  16. prefer-ip-address: true #访问路径可以显示ip地址
  17. #Eureka客户端向服务端发送心跳的时间间隔,单位秒(默认30秒)
  18. lease-renewal-interval-in-seconds: 1
  19. #Eureka服务端在收到最后一次心跳后等待的时间上限,单位秒(默认90秒),超时剔除服务
  20. lease-expiration-duration-in-seconds: 2

主启动类:

  1. @SpringBootApplication
  2. //@EnableDiscoveryClient
  3. public class OrderMain80 {
  4. public static void main(String[] args) {
  5. SpringApplication.run(OrderMain80.class, args);
  6. }
  7. }

4、测试功能

依次启动3个注册中心、消费者和2个服务提供者,访问 localhost:7001

访问  http://localhost:81/consumer/payment/get/3

再次访问:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/839062
推荐阅读
相关标签
  

闽ICP备14008679号