什么是微服务,分布式?html
分布式:不一样的模块部署在不一样的服务器上,能够更好的解决网站高并发。java
微服务:架构设计概念,各服务间隔离(分布式也是隔离),自治(分布式依赖总体组合)其它特性(单一职责,边界,异步通讯,独立部署)是分布式概念的跟严格执行 SOA到微服务架构的演进过程
。简单的说把项目拆分红各各模块,用注册中心的方式把服务都连接在一块儿web
服务提供者:提供服务被人调用算法
消费者:调用服务spring
Eureka是Netflix开发的服务发现框架,自己是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。tomcat
Eureka包含两个组件:Eureka Server和Eureka Client。springboot
Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储全部可用服务节点的信息,服务节点的信息能够在界面中直观的看到。服务器
Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就是一个内置的、使用轮询(round-robin)负载算法的负载均衡器。网络
环境搭建:架构
本次环境用Gradle+IDEA
1.先搭建注册中心
主项目Gradle
group 'com.wang' version = '0.0.1-SNAPSHOT' apply plugin: 'java' sourceCompatibility = 1.8 buildscript { ext {//定义一个变量,统一规定springboot的版本 springBootVersion = '1.5.10.RELEASE' } repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } jcenter() mavenCentral() //Spring repo maven { url "http://repo.spring.io/snapshot" } maven { url "http://repo.spring.io/milestone" } maven { url "http://repo.spring.io/release" } maven { url 'http://repo.spring.io/plugins-snapshot' } } dependencies {//用来打包 classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") } } //设定当前全部的项目的配置 allprojects { group 'com.ssx' version = '0.0.1-SNAPSHOT' ext { springCloudVersion = 'Edgware.SR2' } repositories { maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' } jcenter() mavenCentral() //Spring repo maven { url "http://repo.spring.io/snapshot" } maven { url "http://repo.spring.io/milestone" } maven { url "http://repo.spring.io/release" } maven { url 'http://repo.spring.io/plugins-snapshot' } } } //设定当前模块项目中的配置 subprojects { apply plugin: 'java' apply plugin: 'idea' apply plugin: 'spring-boot' dependencies { //使用springboot-web组件,可是排除tomcat组件 compile('org.springframework.boot:spring-boot-starter-web') { exclude module: "spring-boot-starter-tomcat" } //使用undertow做为应用服务,做为servlet容器 compile 'org.springframework.boot:spring-boot-starter-undertow' //使用健康检查组件 compile 'org.springframework.boot:spring-boot-starter-actuator' testCompile( group: 'junit', name: 'junit', version: '4.12' ) } dependencyManagement { imports { //加上此配置后,若是须要引用springcloud的组件,就不须要再提供版本信息 mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}" } } }
添加注册中心的依赖
dependencies{ implementation 'org.springframework.cloud:spring-cloud-starter-eureka-server' }
注册中心启动类
@SpringBootApplication @EnableEurekaServer //表示这个项目为eureka的注册中心 public class EurekaApplication { public static void main(String[] args) { SpringApplication.run(EurekaApplication.class,args); } }
注册中心Yaml文件
server: port: 8085 spring: application: name: register-center eureka: client: register-with-eureka: false #启动时不注册 fetch-registry: false #不向注册中心拉去数据 server: enable-self-preservation: false #关闭自我保护
启动注册中心,端口号为8085
这个为Eureka的信息页面 能够看到这个时候 Instances currently registered with Eureka里面是No instances available 也就是这个时候尚未服务注册进来,下面咱们写注册方,也就是客户端
客户端的启动类
@SpringBootApplication @EnableEurekaClient //它是eureka客户端也就是服务 public class ShoppingMallApplication { public static void main(String[] args) { SpringApplication.run(ShoppingMallApplication.class,args); } }
客户端的yaml
server: port: 8086 spring: application: name: shopping-mall eureka: client: service-url: defaultZone: http://localhost:8085/eureka/
此时也要添加子项目的依赖
另外必须是指定注册中心的端口号,往里面注册服务
从新访问刷新注册中心就能够看到一个服务注入进来,solr服务类照葫芦画瓢
这个就是实现了 注册也发现,那咱们紧接这 如何实现服务与服务之间调用呢?我如今想project-shopping-mall模块的controller调用solr的controller如何实现呢?
@SpringBootApplication @EnableEurekaClient //它是eureka客户端也就是服务 public class ShoppingMallApplication { @Bean @LoadBalanced public RestTemplate restTemplate(){ RestTemplate template=new RestTemplate(); return template; //表示网络请求 } public static void main(String[] args) { SpringApplication.run(ShoppingMallApplication.class,args); } } @Controller public class ShopController { @Autowired RestTemplate restTemplate; @RequestMapping("/toIndex") public String toIndex(Model model){ String msg=restTemplate.getForEntity("http://SOLR/solrSear",String.class).getBody(); model.addAttribute("msg",msg); return "index"; } }
这个为调用solr的controller根据名字调用
@RestController public class SolrController { @RequestMapping("/solrSear") public String solrSear(){ return "从solr查询到数据"; } }
意思就是说 我在shop里调用solr的controller他会返回一个从solr查询到数据
这里还须要添加一个依赖
dependencies{ implementation 'org.springframework.cloud:spring-cloud-starter-eureka-server' // https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf compile group: 'org.springframework.boot', name: 'spring-boot-starter-thymeleaf' }
shop模块里有thymeleaf模板展现数据,这个是咱们的index页面
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"/> <title>Title</title> </head> <body> <h1>欢迎进入商场</h1> <span th:text="${msg}"></span> </body> </html>

访问页面成功
能够看到咱们成功拿到了数据