springcloud初探-搭建微服务Eureka实现服务提供者集群Feign简化消费者操作+负载均衡和熔断器等

Posted Fire king

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了springcloud初探-搭建微服务Eureka实现服务提供者集群Feign简化消费者操作+负载均衡和熔断器等相关的知识,希望对你有一定的参考价值。

springcloud

搭建前准备

  • springboot默认的mysql版本是8.几,建立springcloud项目时父工程导入
    以下依赖会出现时区问题:
<!--使用druid整合mysql数据库 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
  • 创建消费者模块的时候出现了bug,原因是子工程继承父工程的依赖
 <!--使用druid整合mysql数据库 -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>

    <!--阿里数据源 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.12</version>
    </dependency>

这些依赖会去寻找数据源,但消费者不需要配置数据源,所以找不到。

Action:

Consider the following:
	If you want an embedded database (H2, HSQL or Derby), please put it on the classpath.
	If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

解决:
主启动类

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

搭建微服务工程

在这里插入图片描述

1.建立父工程(打pom包)

pom.xml管理整个微服务工程的依赖
在这里插入图片描述

2.导包

注释掉有关redis的依赖,不然后面的操作可能会出错。

<!--导入springBoot依赖包 -->
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.1.1.RELEASE</version>
		<relativePath />
	</parent>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<!--依赖管理,用于管理spring-cloud的依赖 -->
	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Finchley.SR2</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
		</dependencies>
	</dependencyManagement>
	<repositories>
		<repository>
			<id>spring-milestones</id>
			<name>Spring Milestones</name>
			<url>https://repo.spring.io/milestone</url>
			<snapshots>
				<enabled>false</enabled>
			</snapshots>
		</repository>
	</repositories>

	<dependencies>
		<!--导入springCloudjar包 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-stream</artifactId>
		</dependency>

		<!--引入springBoot jar包 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

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

		<!--支持热部署 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
			<version>1.2.8.RELEASE</version>
		</dependency>

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

		<!--整合redis -->
		<dependency>
			<groupId>redis.clients</groupId>
			<artifactId>jedis</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.data</groupId>
			<artifactId>spring-data-redis</artifactId>
		</dependency>

		<!--导入pojo插件 -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
		
		<!--使用druid整合mysql数据库 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>

		<!--阿里数据源 -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
			<version>1.1.12</version>
		</dependency>

		<!--mybatis-plus配置 -->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.0.6</version>
		</dependency>
	</dependencies>

2.普通maven创建子工程服务提供者和服务消费者

在这里插入图片描述

3.配置服务提供者和消费者的.yml文件

3.1.服务提供者:

server:
  port: 8082
  servlet:
    context-path: /
#配置访问端口和访问的根路径
#配置数据源
spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource #使用druid连接池
    url: jdbc:mysql://localhost:3306/db_shop?characterEncoding=utf8
    password: root
    username: root
    driver-class-name: com.mysql.jdbc.Driver
    druid: #配置 Druid 的相关参数
      # 初始化大小,最小,最大
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000 # 配置获取连接等待超时的时间
      time-between-eviction-runs-millis: 60000  # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位毫秒
      min-evictable-idle-time-millis: 300000   # 配置一个连接在池中最小生存时间
      validation-query: SELECT 1              #SELECT 1 FROM sys_user
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true  # 打开 PSCache,并且指定每个连接上 PSCache 的大小
      max-pool-prepared-statement-per-connection-size: 20
      #filters: stat,wall,log4j  # 配置监控统计拦截的 Filter,去掉后监控界面 SQL 无法统计,wall 用于防火墙
      web-stat-filter: # 配置 DruidStatFilter
        enabled: true
        url-pattern: /*
        exclusions: .js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*
      stat-view-servlet: # 配置 DruidStatViewServlet
        url-pattern: /druid/*
        # IP 白名单,没有配置或者为空,则允许所有访问
        allow: 127.0.0.1
        # IP 黑名单,若白名单也存在,则优先使用
        deny: 192.168.31.253
        # 禁用 html 中 Reset All 按钮
        reset-enable: false
        # 登录用户名/密码
        login-username: root
        login-password: 123456

  #视图解析配置——可配可不配
  mvc:
    view:
      prefix: /templates/
      suffix: .html

#Mybatis——plus
mybatis-plus:
  type-aliases-package: edu.xlh.pojo #配置别名
  mapper-locations: classpath:mappers/*.xml #指定映射文件的位置
  configuration:
    map-underscore-to-camel-case: false  #自动开启驼峰规则映射




3.2.服务消费者:

server:
  port: 8081
  servlet:
    context-path: /

4.服务提供者添加mysql驱动依赖

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

5.服务提供者程序入口类

添加@SpringBootApplication注解和@MapperScan("edu.xlh.mapper")扫描持久层包

//主启动类
@SpringBootApplication
@MapperScan("edu.xlh.mapper")
public class SpringCloud8082provider {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloud8082provider.class,args);
    }
}

6.服务消费者程序入口类

添加@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)注解

@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
public class SpringCloud8081consumer {
    public static void main(String[] args) {
        SpringApplication.run(SpringCloud8081consumer.class,args);
    }
}

7.测试

7.1.配置远程调用组件:

在这里插入图片描述

@Configuration
public class RestTemplateConfig {
    @Bean//创建对象交给spring管理
    public RestTemplate getTemplate(){
        return new RestTemplate();
    }
}

7.2.服务提供者-8082:

@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/provider/getAll")
    @ResponseBody
    public List<User> findAllUserInfo(){
        System.out.println("----------8082服务");
        return userService.findAllUsers();
    }

7.3.服务消费者-8081:

@Controller
@RequestMapping("/user")
public class UserControllerConsumer {
    //PROVIDER-USER代表两个服务提供者的实例
    private String commonUrl="http://localhost:8082/user/";

    @Autowired
    private RestTemplate restTemplate;

    @RequestMapping("/consumer/find")
    @ResponseBody
    public List<User> findAllUsers(){
        String url = commonUrl+"provider/getAll";
        List list = restTemplate.getForObject(url, List.class);
        return list;
    }

localhost:8081/user//consumer/find访问

8.抽取接口

8.1.建子模块

在这里插入图片描述

8.2.打jar包安装到本地仓库

在这里插入图片描述

8.3.服务提供者和消费者导入依赖

 <!--引入接口-->
        <dependency>
            <groupId>edu.xlh</groupId>
            <artifactId>springcloud-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

9.通过注册Eureka实现服务提供者集群

9.1.建子模块

在这里插入图片描述

9.2.导入依赖

        <!--添加 eureka 注册中心 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
        </dependency>

出错时可能还要加的依赖:

<dependency>
            <groupId>javax.xml.bind</groupId>
            <artifactId>jaxb-api</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.glassfish.jaxb</groupId>
            <artifactId>jaxb-runtime</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>javax.activation</groupId>
            <artifactId>activation</artifactId>
            <version>1.1.1</version>
        </dependency>

9.3.配置application.yml

server:
  port: 7000        #定义注册中心端口
eureka:
  server:
    enable-self-preservation: true  #设定自我保护模式 默认值为true 不建议关闭
  instance:
    hostname: localhost        #eureka服务的实例名称,如果有多个服务名称必须不同
  client:
    register-with-eureka: false   #表示注册中心 不会注册自己本身
    fetch-registry: false         #表示自己就是注册中心,不需要检索服务
    service-url:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
      #defaultZone: http://localhost:7000/eureka

9.4.建立一个端口为8083的服务提供者

在这里插入图片描述
修改从8082服务提供者copy过来的application.yml中的端口为8083:

server:
  port: 8083
  servlet:
    context-path: /

9.5.在两个服务的提供者和一个消费者application.yml配置Eureka客户端

9.5.1.提供者:

其中instance-id: provider-user-8082与不同端口号服务以此区别,例如8083服务提供者instance-id: provider-user-8083

 #这个是配置Eureka 的客户端
  application: #定义服务名称,如果是多个相同的服务,则名称必须相同
    name: provider-user
eureka:
  client:
    service-url:
      defaultZone: http://localhost:7000/eureka
    instance:
      instance-id: provider-user-8082                 #定义微服务的名称
      prefer-ip-address: true                        #是否显示IP和端口

配置后的yml

以上是关于springcloud初探-搭建微服务Eureka实现服务提供者集群Feign简化消费者操作+负载均衡和熔断器等的主要内容,如果未能解决你的问题,请参考以下文章

SpringCloud Hoxton——初探 & Eureka服务注册与发现

云原生微服务SpringCloud-eureka(server)集群搭建

:初探Spring Cloud Eureka+Hystrix+Ribbon+Feign微服务搭建

:初探Spring Cloud Eureka+Hystrix+Ribbon+Feign微服务搭建

云原生微服务SpringCloud-eureka(server)集群搭建

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