Spring-Cloud之Eurka微服务注册中心集群和Ribbon负载均衡的搭建

说明:

本案例是依靠狂神说springcloud讲解完成,对于添加部门接口在测试的时候,使用了post请求,添加未成功,其他功能没有问题。

http://localhost/consumer/dept/add?dname=%27aa%27
问题描述:在生产者方,添加接口没有问题,在消费者使用RestTemplate调用postForObject的方法,报错如下,eureka集群添加部门名称功能有问题,解决方案正在处理中。

在这里插入图片描述

springcloud-api的搭建

在这里插入图片描述

  • 主要是封装实体类,添加mysql-connector-java的依赖。
  • 导入依赖
    <dependencies>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
    </dependencies>
  • java实体类
package cn.itcast.springcloud.pojo;

import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * 类描述:
 *
 * @ClassName Dept
 * @Description TODO
 * @Author GZ
 * @Date 2021/10/20 22:23
 * @Version 1.0
 */
@Accessors
@NoArgsConstructor
@Data
public class Dept implements Serializable {
    
    
    private long deptno;
    private String dname;
    private String DB_source;

    public Dept(String dname) {
    
    
        this.dname = dname;
    }
}

springcloud-consumer-dept-80消费者的搭建

  • 消费者中配备了Eurka的服务注册中心 和 Ribbon 的负载均衡
    在这里插入图片描述

application.yaml

server:
  port: 80

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

RestTemplateConfig

package cn.itcast.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;

/**
 * 类描述:
 *
 * @ClassName RestTemplateConfig
 * @Description TODO
 * @Author GZ
 * @Date 2021/10/21 2:01
 * @Version 1.0
 */
@Configuration
public class RestTemplateConfig {
    
    
    @Bean
    @LoadBalanced  //Ribbon的负载均衡
    public RestTemplate getRestTemplate(){
    
    
        return new RestTemplate();
    }

}

ConsumerDept

package cn.itcast.controller;

import cn.itcast.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.client.RestTemplate;

import java.util.List;

/**
 * 类描述:
 *
 * @ClassName ConsumerDept
 * @Description TODO
 * @Author GZ
 * @Date 2021/10/21 1:40
 * @Version 1.0
 */
@RestController
public class ConsumerDept {
    
    
   // private static final String PROVIDERDEPT = "http://localhost:8001";
    private static final String PROVIDERDEPT ="http://SPRINGCLOUD-PROVIDER-DEPT";
    @Autowired
    private DiscoveryClient discoveryClient;

    @Autowired
    private RestTemplate restTemplate;

    @GetMapping("/consumer/dept/all")
    public List<Dept> findAllDept() {
    
    
        return restTemplate.getForObject(PROVIDERDEPT+"dept/all", List.class);
    }

//测试有问题,可删除
    @RequestMapping("/consumer/dept/add")
    public boolean add( @RequestBody Dept dept) {
    
    
        return restTemplate.postForObject(PROVIDERDEPT+"dept/add", dept, Boolean.class);
    }

    @GetMapping("/consumer/dept/get/{deptno}")
    public Dept findById(@PathVariable("deptno") long deptno) {
    
    
       return restTemplate.getForObject(PROVIDERDEPT+"/dept/get/"+deptno, Dept.class);
    }
}

Consumer

package cn.itcast;

import cn.itcast.config.RestTemplateConfig;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.ribbon.RibbonClient;


/**
 * 类描述:
 *
 * @ClassName Consumer
 * @Description TODO
 * @Author GZ
 * @Date 2021/10/21 2:05
 * @Version 1.0
 */
@SpringBootApplication
@EnableEurekaClient
//@RibbonClient(name = "SPRINGCLOUD-PROVIDER-DEPT",configuration = RestTemplateConfig.class)
public class Consumer {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(Consumer.class,args);
    }
}

springcloud-enureka-7001集群的搭建

在这里插入图片描述

依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <version>2.1.4.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
            <version>1.4.6.RELEASE</version>
        </dependency>

EurekaServerPort7001

package cn.itcast.springcloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;

/**
 * 类描述:
 *
 * @ClassName EurekaServer_7001
 * @Description TODO
 * @Author GZ
 * @Date 2021/10/21 14:19
 * @Version 1.0
 */
@SpringBootApplication
@EnableEurekaServer
public class EurekaServerPort7001 {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(EurekaServerPort7001.class,args);
    }
}

application.yaml

server:
  port: 7001

eureka:
  instance:
    hostname: localhost01 #eureka的名称
  client:
    fetch-registry: false #是否将自己作为erueka的注册中心
    register-with-eureka: false #是否将自己注册到eureka中
    service-url:
      defaultZone: http://localhost02:7002/eureka/,http://localhost03:7003/eureka/
  server:
    # 关闭自我保护机制,保证不可用的服务被及时剔除
    enable-self-preservation: false
    # 如果2秒内没有收到某个微服务的心跳,那就剔除该微服务,单位为毫秒
    eviction-interval-timer-in-ms: 2000


springcloud-enureka-7002集群的搭建

在这里插入图片描述

application.yaml

server:
  port: 7002

eureka:
  instance:
    hostname: localhost02 #eureka的名称
  client:
    fetch-registry: false #是否将自己作为erueka的注册中心
    register-with-eureka: false #是否将自己注册到eureka中
    service-url:
      defaultZone: http://localhost01:7001/eureka/,http://localhost03:7003/eureka/
  server:
    # 关闭自我保护机制,保证不可用的服务被及时剔除
    enable-self-preservation: false
    # 如果2秒内没有收到某个微服务的心跳,那就剔除该微服务,单位为毫秒
    eviction-interval-timer-in-ms: 2000


  • 配置文件不同,名称不同,其他与springcloud-enureka-7001完全相同

springcloud-enureka-7003集群的搭建

在这里插入图片描述

application.yaml

server:
  port: 7003

eureka:
  instance:
    hostname: localhost03 #eureka的名称
  client:
    fetch-registry: false #是否将自己作为erueka的注册中心
    register-with-eureka: false #是否将自己注册到eureka中
    service-url:
      defaultZone: http://localhost01:7001/eureka/,http://localhost02:7002/eureka/
  server:
    # 关闭自我保护机制,保证不可用的服务被及时剔除
    enable-self-preservation: false
    # 如果2秒内没有收到某个微服务的心跳,那就剔除该微服务,单位为毫秒
    eviction-interval-timer-in-ms: 2000


  • 配置文件不同,名称不同,其他与springcloud-enureka-7001完全相同

springcloud-provider-dept-8001生产者的搭建

在这里插入图片描述

DeptController

package cn.itcast.controller;

import cn.itcast.service.DeptService;
import cn.itcast.springcloud.pojo.Dept;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.discovery.DiscoveryClient;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 类描述:
 *
 * @ClassName DeptController
 * @Description TODO
 * @Author GZ
 * @Date 2021/10/20 23:36
 * @Version 1.0
 */
@RestController
public class DeptController {
    
    
    @Autowired
    private DeptService deptService;
    //获取一些配置的信息
    @Autowired
    private DiscoveryClient discoveryClient;

    @GetMapping("/dept/all")
    public List<Dept> findAllDept() {
    
    
        return deptService.findAllDept();
    }

    @RequestMapping("/dept/add")
    public Boolean addDept(Dept dept) {
    
    
        return deptService.addDept(dept);
    }

    @GetMapping("/dept/get/{deptno}")
    public Dept findById(@PathVariable("deptno") long deptno) {
    
    
        return deptService.findById(deptno);
    }

//    @GetMapping("dept/discover")
//    public Object discover() {
    
    
//        List<String> services = discoveryClient.getServices();
//        System.out.println("微服务信息" + services);
//
//        List<ServiceInstance> instances = discoveryClient.getInstances("springcloud-provider-dept");
//        for (ServiceInstance instance : instances) {
    
    
//            System.out.println(
//                    instance.getHost() + "\t" +
//                            instance.getUri() + "\t" +
//                            instance.getPort() + "\t" +
//                            instance.getServiceId()
//            );
//
//        }
//        return discoveryClient;
//    }
}

DeptMapper

package cn.itcast.mapper;

import cn.itcast.springcloud.pojo.Dept;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;

/**
 * 类描述:
 *
 * @ClassName DeptMapper
 * @Description TODO
 * @Author GZ
 * @Date 2021/10/20 23:05
 * @Version 1.0
 */
@Mapper
@Repository
public interface DeptMapper {
    
    

    public List<Dept> findAllDept();

    public Boolean addDept(Dept dept);

    public Dept findById(long deptno);
}

DeptService

package cn.itcast.service;

import cn.itcast.springcloud.pojo.Dept;

import java.util.List;

public interface DeptService {
    
    
    public List<Dept> findAllDept();

    public Boolean addDept(Dept dept);

    public Dept findById(long deptno);
}

DeptServiceImpl

package cn.itcast.service.impl;

import cn.itcast.mapper.DeptMapper;
import cn.itcast.service.DeptService;
import cn.itcast.springcloud.pojo.Dept;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 类描述:
 *
 * @ClassName DeptServiceImpl
 * @Description TODO
 * @Author GZ
 * @Date 2021/10/20 23:34
 * @Version 1.0
 */
@Service
public class DeptServiceImpl implements DeptService {
    
    
    @Autowired
    private DeptMapper deptMapper;
    @Override
    public List<Dept> findAllDept() {
    
    
        return deptMapper.findAllDept();
    }

    @Override
    public Boolean addDept(Dept dept) {
    
    
        return deptMapper.addDept(dept);
    }
    @Override
    public Dept findById(long deptno) {
    
    
        return deptMapper.findById(deptno);
    }
}

Provider

package cn.itcast;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;

/**
 * 类描述:
 *
 * @ClassName provider
 * @Description TODO
 * @Author GZ
 * @Date 2021/10/20 23:44
 * @Version 1.0
 */
@SpringBootApplication
@EnableEurekaClient//将服务注入进来
//@EnableDiscoveryClient//服务发现
public class Provider {
    
    
    public static void main(String[] args) {
    
    
        SpringApplication.run(Provider.class,args);
    }
}

DeptMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="cn.itcast.mapper.DeptMapper">
   <select id="findAllDept" resultType="Dept">
       select * from dept
   </select>

    <insert id="addDept" parameterType="Dept" >
        insert into dept (dname,DB_source) values (#{dname},DATABASE())
    </insert>
   <select id="findById" parameterType="long" resultType="dept">
       select * from dept where deptno = #{deptno}
   </select>

</mapper>

mybatis-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <settings>
        <setting name="cacheEnabled" value="true"/>
    </settings>

</configuration>

application.yaml

server:
  port: 8001
mybatis:
  type-aliases-package: cn.itcast.springcloud.pojo
  config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/mapper/*.xml



spring:
  application:
    name: springcloud-provider-dept
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/db01?useSSL=true&useUnicode=true&characterEncoding=utf8
    username: root
    password: 1234

eureka:
  client:
    #表示是否将自己注册进EurekaServer默认为true
    register-with-eureka: true
    #是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用 负载均衡
    fetch-registry: true
    service-url:
      #注册中心地址    如果集群每个Eureka注册中心都写上用,间隔
      defaultZone: http://localhost01:7001/eureka/,http://localhost02:7002/eureka/,http://localhost03:7003/eureka/

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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">
    <parent>
        <artifactId>springcloud-demo01</artifactId>
        <groupId>cn.itcast</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-provider-dept-8001</artifactId>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
<dependencies>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
        <version>1.4.6.RELEASE</version>
    </dependency>
<!--    完善监控信息-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>cn.itcast</groupId>
        <artifactId>springcloud-api</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>ch.qos.logback</groupId>
        <artifactId>logback-core</artifactId>
    </dependency>
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid</artifactId>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
    </dependency>
<!--    springboot的启动依赖-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.1.5.RELEASE</version>
    </dependency>
<!--    <dependency>-->
<!--        <groupId>org.springframework.boot</groupId>-->
<!--        <artifactId>spring-boot-starter-jetty</artifactId>-->
<!--        <version>2.0.0</version>-->
<!--    </dependency>-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
    </dependency>
</dependencies>
</project>

整个项目的pom文件

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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>

    <groupId>cn.itcast</groupId>
    <artifactId>springcloud-demo01</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>springcloud-api</module>
        <module>springcloud-provider-dept-8001</module>
        <module>springcloud-consumer-dept-80</module>
        <module>springcloud-enureka-7001</module>
        <module>springcloud-enureka-7002</module>
        <module>springcloud-enureka-7003</module>
    </modules>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
        <junit.version>4.12</junit.version>
        <log4j.version>1.2.17</log4j.version>
        <lombok.version>1.16.18</lombok.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <!--        springcloud-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Greenwich.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--            spring-boot-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>2.1.0.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
            <!--            数据库连接-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.47</version>
            </dependency>
            <!--            连接池-->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.10</version>
            </dependency>
            <!--            mybatis整合springboot-->
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>1.3.2</version>
            </dependency>
            <!--            日志技术-->
            <dependency>
                <groupId>ch.qos.logback</groupId>
                <artifactId>logback-core</artifactId>
                <version>1.2.3</version>
            </dependency>
            <!--            单元测试-->
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>${junit.version}</version>
            </dependency>
            <!--            日志技术-->
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>${log4j.version}</version>
            </dependency>
            <!--            bean文件处理-->
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>${lombok.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

猜你喜欢

转载自blog.csdn.net/m0_57184607/article/details/120896771