SpringCloud简介与简单---微服务开发搭建(提供者与消费者)(1)

x33g5p2x  于2021-12-18 转载在 其他  
字(14.5k)|赞(0)|评价(0)|浏览(293)

简介:

Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智能路由,微代理,控制总线 )。分布式系统的协调导致了样板模式, 使用Spring Cloud开发人员可以快速地支持实现这些模式的服务和应用程序。他们将在任何分布式环境中运行良好,包括开发人员自己的笔记本电脑,裸机数据中心,以及Cloud Foundry等托管平台。

Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用Spring Boot的开发风格做到一键启动和部署。Spring并没有重复制造轮子,它只是将目前各家公司开发的比较成熟、经得起实际考验的服务框架组合起来,通过Spring Boot风格进行再封装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发工具包

以下为Spring Cloud的核心功能:

分布式/版本化配置

服务注册和发现

路由

服务和服务之间的调用

负载均衡

断路器

分布式消息传递

1、请求统一通过API网关(Zuul)来访问内部服务.

2、网关接收到请求后,从注册中心(Eureka)获取可用服务

3、由Ribbon进行均衡负载后,分发到后端具体实例

4、微服务之间通过Feign进行通信处理业务

5、Hystrix负责处理服务超时熔断

6、Turbine监控服务间的调用和熔断相关指标
springcloud 的 版本由伦敦地铁站的名称定义的

想更深入的了解建议去官网
springcloud 中文文档 网站https://springcloud.cc/spring-cloud-dalston.html
开发环境( eclipse , jdk1.8, maven,springboot, springcloud)

1)项目搭建()

首先说springcloud 是一个微服务 开发 的 可以单个模块 作为一个进程来运行
搭建出来cloud父级工程

结构

父级pom文件
包含boot的版本 和cloud的版本
主要定义的pom文件 ,将后续各个子模块公用的jar等统一提取出来 ,类似是一个抽象类 。

<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>com.xxx</groupId>
  <artifactId>microservicecloud</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<maven.compiler.source>1.8</maven.compiler.source>
		<maven.compiler.target>1.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>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.SR1</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>2.1.3.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>mysql</groupId>
				<artifactId>mysql-connector-java</artifactId>
				<version>5.0.4</version>
			</dependency>
			<dependency>
				<groupId>com.alibaba</groupId>
				<artifactId>druid</artifactId>
				<version>1.0.31</version>
			</dependency>
			<dependency>
				<groupId>org.mybatis.spring.boot</groupId>
				<artifactId>mybatis-spring-boot-starter</artifactId>
				<version>1.3.0</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>
				<scope>test</scope>
			</dependency>
			<dependency>
				<groupId>log4j</groupId>
				<artifactId>log4j</artifactId>
				<version>${log4j.version}</version>
			</dependency>
		</dependencies>
	</dependencyManagement>
</project>

在创建 子模块 的 公共类

1 )

pom文件

<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>
  <parent><!-- 子类里面显示声明才能有明确的继承表现,无意外就是父类的默认版本否则自己定义 -->
    <groupId>com.xxx</groupId>
    <artifactId>microservicecloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>microservicecloud-api</artifactId><!--  当前Module我自己叫什么名字-->  
  	<dependencies><!-- 当前Module需要用到的jar包,按自己需求添加,如果父类已经包含了,可以不用写版本号 -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-feign</artifactId>
		</dependency>
	</dependencies>
</project>

这时 父级的包路径也会多一个microservicecloud-api公共的包 这样也就意味着父级工程包含着这个公共类
当这个pom文件到入就会发父级 的pom文件名 就会 多一个<module>microservicecloud-api</module>

在创建之后 创建实体类 以便于 以后使用 减少代码的冗余

在构建一个springBoot子模块 microservicecloud-provider-dept-8083(提供者)

建完之后 父级 项目同样多一个子包

pom文件

注意:引入自己定义的api公共包,可以使用Usert的use 这个实体类剩下的就是springboot的依赖

<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>
  <parent>
    <groupId>com.xxx</groupId>
    <artifactId>microservicecloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>microservicecloud-provider-dept-8083</artifactId>
	<dependencies>
		<!-- 引入自己定义的api通用包,可以使用Usert的user -->
		<dependency>
			<groupId>com.xxx</groupId>
			<artifactId>microservicecloud-api</artifactId>
			<version>${project.version}</version>
		</dependency>
		<!-- actuator监控信息完善 -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-actuator</artifactId>
		</dependency>
		
		<!-- 将微服务provider侧注册进eureka -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-config</artifactId>
		</dependency>
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>druid</artifactId>
		</dependency>
		<dependency>
			<groupId>ch.qos.logback</groupId>
			<artifactId>logback-core</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-jetty</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-test</artifactId>
		</dependency>
		<!-- 修改后立即生效,热部署 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
	</dependencies>

</project>

.yml配置文件

server:
  port: 8083
  
mybatis:
                                          
  type-aliases-package: com.xxx.user                  # 所有user别名类所在包
  mapper-locations:
  - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件
    
spring:
   application:
    name: microservicecloud-dept 
   datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
    driver-class-name: com.mysql.jdbc.Driver               # mysql驱动包
    url: jdbc:mysql://localhost:3306/1807              # 数据库名称
    username: root
    password: root
    dbcp2:
      min-idle: 5                                           # 数据库连接池的最小维持连接数
      initial-size: 5                                       # 初始化连接数
      max-total: 5                                          # 最大连接数
      max-wait-millis: 200  
      
freemarker: 
    template-loader-path: classpath:/templates/
    cache: false
    charset: UTF-8
    check-template-location: true
    content-type: text/html; charset=utf-8
    expose-request-attributes: true
    expose-session-attributes: true
    request-context-attribute: request                                                         

       
logging:     # 打印日志
   level:   
     com.xxx.mapper: debug

springboot 结构

controller层

package com.xxx.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

import com.xxx.service.UserService;
import com.xxx.user.User;

@Controller
public class UserController {

	@Autowired
	private UserService  userService;
	
	@RequestMapping(value = "/list/user", method = RequestMethod.GET)
	public String list(ModelMap map){
		List<User> list=userService.list();
		map.put("list", list);
		return "user";
	}
}

Userserviceimp层

package com.xxx.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.xxx.mapper.UserMapper;
import com.xxx.service.UserService;
import com.xxx.user.User;
@Service
public class UserServiceImpl implements UserService {

	@Autowired
	private UserMapper userMapper;

	@Override
	public List<User> list() {
		// TODO Auto-generated method stub
		return userMapper.findAll();
	}
	
	
}

mapper接口 和mapper.xml 启动类 不在介绍

.FTL

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
  <center>
    <table border="1">
        <tr>
            <th>姓名</th>
            <th>性别</th>
            <th>年龄</th>
            <th>修改</th>
            <th>删除</th>
        </tr>
    <#list list as user>
        <tr>
            <td>${user.userId}</td>
            <td>${user.userName}</td>
             <td>${user.userSex}</td>
            <td>${user.userAge}</td>
            <td><a >修改</a></td>
            <td><a >删除</a></td>

        </tr>
    </#list>
        <tr>
            <td><a >新增</a></td>
        </tr>
    </table>

</center>
</body>
</html>

这些都 准备好 首先为了更好的 理解 可以先看 一下任务管理器的 进程

启动 boot
选择启动类 右击 -->runAS–>Spring Boot App

启动成功看一下 进程

看一下 结果
已经展示到页面 ,把公共类分离,是可以使用的

在构建 一个 microservicecloud-consumer-dept-8084模块(消费者)

1,

这时候 父级工下会有microservicecloud-consumer-dept-8084的包

1. microservicecloud-consumer-dept-8084 pom配置文件

<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>
  <parent>
    <groupId>com.xxx</groupId>
    <artifactId>microservicecloud</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>microservicecloud-consumer-dept-8084</artifactId>
     <description>用户微服务消费者</description>
  <dependencies>   
		<dependency><!-- 自己定义的api -->
			<groupId>com.xxx</groupId>
			<artifactId>microservicecloud-api</artifactId>
			<version>${project.version}</version>
		</dependency>
		<!-- Ribbon相关 -->
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-eureka</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-ribbon</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.cloud</groupId>
			<artifactId>spring-cloud-starter-config</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<!-- 修改后立即生效,热部署 -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>springloaded</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-devtools</artifactId>
		</dependency>
		
			<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-freemarker</artifactId>
		</dependency>
	</dependencies>
	 
</project>

2. application.yml 配置文件

我在这里只配置了一个端口 因为只需要一个端口

server:
  port: 8084

3. 创建ConfigBean类

package com.xxx.cfgbeans;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration //相当与配置 文件application.xml
public class ConfigBean {
	
	
	@Bean
	public RestTemplate geRestTemplate() {
		
		return  new RestTemplate();
	}
	
	

}

4.controller类

package com.xxx.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import com.xxx.user.User;

@Controller
public class UserControllerConsumer {
    //定义提供者的http://.........
	private static final String REST_URL_PREFIX="http://localhost:8083";
	
	
	@Autowired
	private RestTemplate restTemplate; //RestTemplate提供了很多的便捷访问远程Http服务的方法	是一种简洁的访问restfuiA模板类。
	//是Spring提供的用于 访问 REst服务的 客户端模板工具类
	 
	/**
	 * 消费者 查询
	 * @return
	 */
     /*使用 使用restTemplate访问restful接口非常的简单 (url, requestMap,
	 ResponseBean.class)这三个参数分别代表 REST请求地址、请求参数、HTTP响应转换被转换成的对象类型。*/
	@RequestMapping(value="/tt/user/list",  method = RequestMethod.GET)
    @ResponseBody
	public String   list() {
		   //定义的http+"提供者的方法",类型.class 应为我的提供者方法是 String 所以这里也是String  
		  return restTemplate.getForObject(REST_URL_PREFIX+"/list/user",String.class);
	}
	
	
	
	
}

5.启动类

package com.xxx;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.zuul.filters.discovery.PatternServiceRouteMapper;

@SpringBootApplication
public class UserConsumerApp {

  public static void main(String[] args) {

	  SpringApplication.run(UserConsumerApp.class, args);
	  
}
	
}

结构

6.启动项目

提供者和消费者两个都要启动

现在 在去看一下进程 更好的理解微服务
也就是每多启动一个项目 就会多一个进程

打开浏览器 访问一下 注意是拿 消费者的端口 (8084)访问

消费者可以拿到数据

查看日志

相关文章