什么是微服务,分布式?

分布式:不同的模块部署在不同的服务器上,可以更好的解决网站高并发。

微服务:架构设计概念,各服务间隔离(分布式也是隔离),自治(分布式依赖整体组合)其它特性(单一职责,边界,异步通信,独立部署)是分布式概念的跟严格执行 SOA到微服务架构的演进过程。简单的说把项目拆分成各各模块,用注册中心的方式把服务都链接在一起

服务提供者与消费关系

服务提供者:提供服务被人调用

消费者:调用服务

Eureka是Netflix开发的服务发现框架,本身是一个基于REST的服务,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。

 

Eureka包含两个组件:Eureka Server和Eureka Client。

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>

 

访问页面成功

可以看到我们成功拿到了数据

到这里我们已经实现服务的注册与发现,有问题请及时评论。