SpringCloud-Eureka

SpringCloud-Eureka

_

Eureka服务的三个角色

  • 服务注册中心
    • Eureka 提供的服务端, 提供服务注册与发现的功能, 一般被称作eureka-server
  • 服务提供者
    • 提供服务的应用, 可以是Spring Boot 应用, 也可以是其他技术平台且遵循Eureka 通信机制的应用。它将自己提供的服务注册到Eureka, 以供其他应用发现
  • 服务消费者
    • 消费者应用从服务注册中心获取服务列表, 从而使消费者可以知道去何处调用其所需要的服务

注册中心

项目创建

创建 module
cloud-eureka-server7001
cloud-eureka-server7002
cloud-eureka-server7003

依赖

分别导入

        <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>

配置文件

7001

server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001.com #eureka服务端的实例名称
  client:
    #false表示不向注册中心注册自己
    register-with-eureka: false
    #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    fetch-registry: false
    service-url:
    #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/

7002

server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002.com #eureka服务端的实例名称
  client:
    #false表示不向注册中心注册自己
    register-with-eureka: false
    #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    fetch-registry: false
    service-url:
      #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7003.com:7003/eureka/

7003

server:
  port: 7003

eureka:
  instance:
    hostname: eureka7003.com #eureka服务端的实例名称
  client:
    #false表示不向注册中心注册自己
    register-with-eureka: false
    #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    fetch-registry: false
    service-url:
      #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
      defaultZone: http://eureka7002.com:7002/eureka/,http://eureka7001.com/7001/eureka/

启动类

都一样,加上 @EnableEurekaServer 注解即可

@SpringBootApplication
@EnableEurekaServer
public class EurekaMain7001 {
    public static void main(String[] args) {
        SpringApplication.run(EurekaMain7001.class,args);
    }
}

服务提供者

项目创建

创建module

cloud-provider-payment8001
cloud-provider-payment8002

两个项目除了项目名和端口不一样,其他都一样

依赖

<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>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>

        <dependency>
            <groupId>com.qc.springcloud</groupId>
            <artifactId>cloud-provider-payment8001</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>com.qc.springcloud</groupId>
            <artifactId>cloud-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
            <scope>compile</scope>
        </dependency>

配置文件

server:
  port: 8001

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/sl?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
    username: root
    password: 123456
  application:
    name: cloud-payment-service

mybatis-plus:
  mapper-locations: classpath:/mapper/*Mapper.xml
  type-aliases-package: com.qc.springcloud.pojo
  configuration:
    map-underscore-to-camel-case: true
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

eureka:
  client:
    #表示是否将自己注册进EurekaServer默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka,http://eureka7003.com:7003/eureka
  instance:
    #信息
    instance-id: payment8001

controller

package com.qc.springcloud.controller;

import com.qc.springcloud.entity.Payment;
import com.qc.springcloud.service.PaymentService;
import com.qc.springcloud.vo.CommonResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * @author c
 * @create: 2021-04-21 18:14
 */
@RestController
@Slf4j
public class PaymentController {

    @Resource
    public PaymentService paymentService;

    @Value("${server.port}")
    private String port;

    /**
     * 服务发现
     */
    @Resource
    private DiscoveryClient discoveryClient;

    @PostMapping("/addPayment")
    public CommonResult addPayment(Payment payment){
        boolean save = paymentService.save(payment);
        if (save){return new CommonResult(200,"新增成功 : "+port,null);}
        return new CommonResult(503,"新增错误",null);
    }

    @PostMapping("/deletePayment/{pId}")
    public CommonResult deletePayment(@PathVariable long pId){
        boolean b = paymentService.removeById(pId);
        if (b){return new CommonResult(200,"删除成功 : "+port,null);}
        return new CommonResult(506,"删除异常",null);
    }

    @PostMapping("/updatePayment")
    public CommonResult updatePayment(Payment payment){
        boolean b = paymentService.updateById(payment);
        if (b){return new CommonResult(200,"更新成功 : "+port,null);}
        return new CommonResult(504,"更新异常异常",null);
    }

    @RequestMapping("/paymentById/{pId}")
    public CommonResult paymentById(@PathVariable long pId){
        log.info("pId={}",pId);
        Payment payment = paymentService.getById(pId);
        return new CommonResult(200,"查询成功 : "+port,payment);
    }

    @RequestMapping("/paymentList")
    public CommonResult paymentList(){
        List<Payment> paymentList = paymentService.list();
        return new CommonResult(200,"查询成功 : "+port,paymentList);
    }

    /**
     * 提供服务发现接口
     */
    @GetMapping("/payment/discovery")
    public Object discovery(){
        List<String> services = discoveryClient.getServices();
        services.forEach(s -> log.info("***element:"+s));
        List<ServiceInstance> instances = discoveryClient.getInstances("CLOUD-PAYMENT-SERVICE");
        instances.forEach(serviceInstance -> log.info(serviceInstance.getInstanceId()
        +"\t"+serviceInstance.getHost()+"\t"+serviceInstance.getPort()+"\t"+serviceInstance.getUri()));
        return this.discoveryClient;
    }
}

启动类

@SpringBootApplication
@MapperScan("com.qc.springcloud.mapper")
@EnableTransactionManagement
@EnableEurekaClient
public class PaymentMain8001 {
    public static void main(String[] args) {
        SpringApplication.run(PaymentMain8001.class,args);
    }
}

服务消费者

创建module

cloud-consumer-order80

依赖

        <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.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
        </dependency>

	<!-- 自己写的公共包 -->
        <dependency>
            <groupId>com.qc.springcloud</groupId>
            <artifactId>cloud-commons</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
        </dependency>

    </dependencies>

配置文件

server:
  port: 80

spring:
  application:
    name: cloud-order-service

eureka:
  client:
    #表示是否将自己注册进EurekaServer默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
    fetch-registry: true
    service-url:
      defaultZone: http://eureka7001.com:7001/eureka,http://eureka7002.com:7002/eureka.http://eureka7003.com:7003/eureka

config

@Configuration
public class ApplicationContextConfig {

    /**
     *使用@LoadBalanced注解赋予RestTemplate负载均衡的能力
     */
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate(){
        return new RestTemplate();
    }

}

controller

消费者没有mapper和service

使用RestTemplate 调用服务服务提供者的借口

@RestController
public class OrderController {

//    private static final  String REST_PREFIX = "http://localhost:8001";
    private static final  String REST_PREFIX = "http://CLOUD-PAYMENT-SERVICE";

    @Resource
    private RestTemplate restTemplate;

    @PostMapping("/consumer/payment/addPayment")
    public CommonResult<Payment> addPayment(Payment payment){

        return restTemplate.postForObject(REST_PREFIX+"/addPayment",payment,CommonResult.class);
    }

    @PostMapping("/consumer/payment/deletePayment/{pId}")
    public CommonResult deletePayment(@PathVariable long pId){

        return restTemplate.postForObject(REST_PREFIX+"/deletePayment",pId,CommonResult.class);
    }

    @PostMapping("/consumer/payment/updatePayment")
    public CommonResult updatePayment(Payment payment){

        return  restTemplate.postForObject(REST_PREFIX+"/deletePayment",payment,CommonResult.class);
    }

    @RequestMapping("/consumer/payment/paymentById/{pId}")
    public CommonResult paymentById(@PathVariable long pId){

        return  restTemplate.postForObject(REST_PREFIX+"/paymentById",pId,CommonResult.class);
    }

    @RequestMapping("/consumer/payment/paymentList")
    public CommonResult paymentList(){
        return  restTemplate.postForObject(REST_PREFIX+"/paymentList",null,CommonResult.class);
    }

}
Java垃圾回收 2021-04-24
SpringCloud-Zookeeper 2021-04-29

评论区