技术标签: Java Srping SpringCloud教程 SrpingCloud
废话不多讲,跟紧我,开启你的SpringCloud初体验
首先回顾微服务的基本组成:
[图片 here]
所以,首先明白springcloud微服务的架构基础 :生产者(client),消费者(client),服务注册/发现中心(server)
*************************************************************************************************************************
预先说明!!springboot与SpringCloud及SpringCloud的相关组件有版本兼容问题,以下代码中选择的版本都是经过实际测试,请勿随意修改版本,否则会出现未知问题!
**************************************************************************************************************************
先看demo结构:基础组件学习共需要创建7个小spring-boot项目,本章节先创建其中4个基础项目,其余组件的学习后续加入进来即可, JDK统一选择1.8
创建简单的名为j-cloud的springboot工程,打包方式为pom,pom.xml如下:
<?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.jorian.framework</groupId>
<artifactId>j-cloud</artifactId>
<version>1.0.0</version>
<packaging>pom</packaging>
<name>j-cloud</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!-- Swagger API文档 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>com.github.xiaoymin</groupId>
<artifactId>swagger-bootstrap-ui</artifactId>
<version>1.9.3</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-bean-validators</artifactId>
<version>2.9.2</version>
</dependency>
</dependencies>
<modules>
</modules>
</project>
1.在父工程j-cloud右击创建一个module: j-cloud-server-eureka
2.填写相关信息
3.新创建的模块结构如下:
4.模块j-cloud-server-eureka的pom.xml如下:
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.jorian.framework</groupId>
<artifactId>j-cloud-server-eureka</artifactId>
<version>1.0.0</version>
<name>j-cloud-server-eureka</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<!--eureka-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--LOMBOK-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
5.模块j-cloud-server-eureka的application.yml如下
spring:
security:
basic:
enabled: true
user:
name: jorian
password: 123456
server:
port: 8761
eureka:
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://jorian:123456@localhost:8761/eureka
注意 :yml格式的文件有特殊要求,必须树形结构,不能有tab,具体请百度
6.模块j-cloud-server-eureka的启动类需加上注解@EnableEurekaServer, 来声明其是一个基于Eureka的服务注册发现中心
package cn.jorian.framework.jcloudservereureka;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@SpringBootApplication
@EnableEurekaServer //标明是一个server
public class JCloudServerEurekaApplication {
public static void main(String[] args) {
SpringApplication.run(JCloudServerEurekaApplication.class, args);
System.out.println("---服务监控访问地址"+"http://localhost:8761");
}
}
7.启动j-cloud-server-eureka服务:
执行main方法启动springboot工程
8.在浏览器访问:http://localhost:8761,查看eureka服务注册发现中心是否启动
启动成功界面如下:
1.同上,在父工程j-cloud右击创建一个module: j-cloud-provider1
2.填写相关信息,打包方式为jar
3.整个工程结构如下:
4.生产者模块j-cloud-provider1的pom.xml如下
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.jorian.framework</groupId>
<artifactId>j-cloud-provider1</artifactId>
<version>1.0.0</version>
<name>j-cloud-provider1</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<!--eureka-client 依赖-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--LOMBOK-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
<!--单元测试依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.4.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
5.生产者模块j-cloud-provider1的application.yml如下, 此处注意配置文件中声明了服务注册中心的地址
# 应用端口
server:
port: 7901
spring:
application:
# 应用名称
name: provider-user
# eureka 配置
eureka:
client:
serviceUrl:
defaultZone: http://jorian:123456@localhost:8761/eureka
logging:
level:
root: INFO
6.生产者模块j-cloud-provider1的启动类如下,添加注解:@EnableEurekaClient来声明其是一个client(生产者或者消费者,在这里他是生产者)
package cn.jorian.framework;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
/**
* @author jorian
*/
@SpringBootApplication
@EnableEurekaClient //表明这是一个eureka客户端
public class JCloudProvider1Application {
public static void main(String[] args) {
SpringApplication.run(JCloudProvider1Application.class, args);
}
}
7.创建UserController.java,用来提供测试用的API
UserController.java代码
package cn.jorian.framework.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("/sayHello")
public String sayhello(){
return "I`m provider 1 ,Hello consumer!";
}
@RequestMapping("/sayHi")
public String sayHi(){
return "I`m provider 1 ,Hello consumer!";
}
@RequestMapping("/sayHaha")
public String sayHaha(){
return "I`m provider 1 ,Hello consumer!";
}
}
8.执行main方法,启动生产者模块: j-cloud-provider1
9.在浏览器访问或者刷新:http://localhost:8761,在eureka服务注册发现中心查看生产者服务是否已被发现注册
注册成功如下:可以看到应用名称,访问地址,也可以自行测试接口的返回结果
1.同上,在父工程j-cloud右击创建一个module:j-cloud-sonsumer
2.填写相关信息,打包方式为jar
3.整个消费者模块:j-cloud-sonsumer工程结构如下:
4.消费者模块:j-cloud-sonsumer的pom.xml如下
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.jorian.framework</groupId>
<artifactId>j-cloud-consumer</artifactId>
<version>1.0.0</version>
<name>j-cloud-consumer</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>Hoxton.SR1</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--LOMBOK-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.20</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.2.4.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
5. 消费者模块:j-cloud-sonsumer的application.yml如下
server:
port: 8001
spring:
application:
name: j-cloud-consumer
# eureka 配置
eureka:
client:
serviceUrl:
defaultZone: http://jorian:123456@localhost:8761/eureka
logging:
level:
root: INFO
6.消费者模块:j-cloud-sonsumer的启动类如下,添加注解:@EnableEurekaClient来声明其是一个client(生产者或者消费者,在这里他是消费者)
package cn.jorian.framework;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
@SpringBootApplication
@EnableEurekaClient
public class JCloudConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(JCloudConsumerApplication.class, args);
}
}
7.创建HelloController对外提供访问API
HelloController代码如下:
package cn.jorian.framework.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
/**
*
* @author jorian
*
*/
@RestController
public class HelloController {
@Bean
@LoadBalanced
public RestTemplate getResttemplate(){
return new RestTemplate();
}
@Autowired
private RestTemplate resttemplate;
@RequestMapping("/hello")
public String hello(){
//指出服务地址 http://{服务提供者应用名名称}/{具体的controller}
String url="http://provider-user/user/sayHello";
//返回值类型和我们的业务返回值一致
return resttemplate.getForObject(url, String.class);
}
@RequestMapping("/hi")
public String hi(){
//指出服务地址 http://{服务提供者应用名名称}/{具体的controller}
String url="http://provider-user/user/sayHi";
//返回值类型和我们的业务返回值一致
return resttemplate.getForObject(url, String.class);
}
@RequestMapping("/haha")
public String haha(){
//指出服务地址 http://{服务提供者应用名名称}/{具体的controller}
String url="http://provider-user/user/sayHaha";
//返回值类型和我们的业务返回值一致
return resttemplate.getForObject(url, String.class);
}
}
7.执行j-cloud-sonsumer的main方法,启动消费者工程
8.在浏览器访问或者刷新:http://localhost:8761,在eureka服务注册发现中心查看消费者服务是否已被发现注册
注册成功如下,可以看到应用名称,访问地址
1.在地址栏直接访问消费者地址,http://localhost:8001/hello,成功调用到 j-cloud-provider1提供的接口并返回结果!
可以采用修改yml文件 中的端口号重复启动实例,也可以另外新建多个provider(我们采用这种方式),修改其中的yml文件中的端口号,然后启动。
由于eureka配置了ribbon负载均衡策略,消费者的请求会在客户端被决定好发送到哪台服务提供者进行处理。
创建与启动过程不再赘述,参考j-cloud-provider1创建启动过程
注意:
- 创建与j-cloud-provider1所有内容一致的j-cloud-provider2
- 只修改第二个生产者j-cloud-provider2 的 application.yml 中的端口号为7902即可
- 注意不要修改application.yml 中的应用名称, 两个生产者要用同样的名称,代表同一个应用的两个实列
- 然后启动工程
第二个生产者模块: j-cloud-provider2项目结构如下:
3.启动成功后在注册中心查看服务注册情况,2个provider都已经上线
4.地址栏重复访问消费者地址N次,http://localhost:8001/hello,会发现返回结果在两个provider切换,实现了负载均衡
第n次:
第n+1次:
至此,基础demo搭建完成
您可以继续查看下一章:springcloud教程 -- 2.feign的使用实践,优雅的发送请求
下载完整工程在这里:若对您有用,帮忙点个赞,谢谢https://github.com/Jorian93/j-cloud.git
文章浏览阅读1.5k次。问题:授权登录时 会弹出重定向的细节 用户体验不好 如下图解决办法:代码追踪 最后发现请求地址文件在vendor/symfony/http-foundation/RedirectResponse.php 如下图及方法以上的html部分就是我们重定向时看到的 为保证框架后续功能稳定 我们只需要将body 隐藏显示 title删除 清除浏览器缓存 再次访问发现就没有了..._easywechat 公众号登录 出现重定向页面
文章浏览阅读1.5k次。http://baike.baidu.com/view/160644.htm交互式数据语言 全称:Interactive Data Language IDL是一种数据分析和图像化应用程序及编程语言,先由美国ITT公司所有_prc idl
文章浏览阅读347次,点赞2次,收藏3次。1.当我们项目写好之后,如何去部署到正式服上去那,部署的时候,我们需要三个东西,项目代码,nginx, uwsgi这三个东西,至于nginx如何安装,我在上一篇博客上已经写了,至于nginx如何代理,nginx还需要配置一下,我们先看一下一个请求过来的流程图:2. 我们先配置nginx,我上一篇博客中nginx已经安装好了,接下来配置就可以了2.1 执行命令:cd /usr/local/nginx/conf2.2 然后打开:vim nginx.conf (nginx.conf就是nginx的配置_基于centos7.9使用docker部署django+nginx+uwsgi,django项目有数据库
文章浏览阅读2k次,点赞3次,收藏17次。任何语言都离不开对文件的操作,Python语言是如何来操作和管理文件的。今天就让我们一起去打开Python文件的世界,Python如何操作和管理文件?_def __init__(self, file1=none,file2=none,file3=none): self.file1 = file1 sel
文章浏览阅读146次。目录1.curl命令简介2.curl命令语法和参数3.curl基本用法介绍4.curl的常见用法(项目应用)1.curl命令简介curl命令是利用URL规则在命令行下工作的文件传输工具,可以说是一款很强大的http命令行工具。它支持文件的上传和下载,是综合传输工具,但按传统,习惯称url为下载工具。2.curl命令语法和参数# curl [option] [url]常见参数-A/--user-agent <string> 设..._linux ctul
文章浏览阅读5.7k次,点赞5次,收藏24次。一、二叉树的最大深度二叉树的最大深度二叉树的最大深度可以通过递归法,层次遍历和深度优先遍历实现,但是最简单最容易的就是递归法。1、递归法1)确定递归三要素递归函数的返回值和参数:返回值为当前节点的最大深度,参数为当前节点递归函数的单层逻辑:当前节点的最大深度 = 1 + 左子树或右子树的最大深度递归函数的终止条件:当前节点为空时,当前节点最大深度为02)递归方法代码class Solution {public: //递归参数及返回值 int maxDepth(Tre_二叉树的深度
文章浏览阅读1.4k次。一、卷积神经网络简介卷积神经网络(Convolutional Neural Network, CNN)最初是为了解决图像识别等问题设计的,当然其现在的应用不仅限于图像和视频,也可以用于时间序列信号,比如音频信号,文本数据等。早期的图像识别研究中,最大的挑战是如何组织特征,因为图像数据不像其他类型的数据那样可以通过人工理解来提取特征。我们需要借助SIFT、HoG等算法提取具有良好区分行的特征。在..._#### 1. 请用tensorflow编写实现一个卷积神经网络,并进行模型效果的可视化展示。
文章浏览阅读430次。这道超级简单的题目没有任何输入。你只需要把这句很重要的话 —— “I Love GPLT”——竖着输出就可以了。所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。输入样例:无输出样例:ILoveGPLT注意:输出的两个空行中各有一个空格。#include<stdio.h>int main(){..._道超级简单的题目没有任何输入。 你只需要把这句很重要的话 —— i love gplt ——竖着输出就可以了。 所谓“竖着输出”,是指每个字符占一行(包括空格),即每行只能有1个字符和回车。
文章浏览阅读1.2w次,点赞3次,收藏6次。首先在windows的附件里面,找到字符映射表,查找黑色的实心方块字符,选择-复制-粘贴到vc6.0的代码编辑区中即可。粘贴到编辑区:_c语言▇黑方块符号
文章浏览阅读5.4k次。问题描述:使用vxe-table框架设置表头居中,某列内容左右对齐方法解决办法:1.table上加上以下内容2.方法中加入cellStyle()方法_vxe-table 居中
文章浏览阅读623次。原标题:代码审计Day13 - 特定场合下addslashes函数的绕过前言大家好,我们是红日安全-代码审计小组。最近我们小组正在做一个PHP代码审计的项目,供大家学习交流,我们给这个项目起了一个名字叫PHP-Audit-Labs。现在大家所看到的系列文章,属于项目第一阶段的内容,本阶段的内容题目均来自PHP SECURITY CALENDAR 2017。对于每一道题目,我们均给出对应的分析,并结...
文章浏览阅读6.2k次,点赞3次,收藏10次。Lambda表达式是定义匿名函数对象的简便方式,通常作为参数传递给算法或异步方法。本文讨论如何传递Lambda到含有函数指针类型参数的函数。关键词:Lambda,回调函数,包装器,函数模板,decltype,auto。_怎么把lambdar表达式转为回调函数