zoukankan      html  css  js  c++  java
  • 高可用服务注册中心、服务提供者、服务消费者|微服务配置内容

    前言:

    高可用服务注册中心:首先要知道什么是一个高可用的服务注册中心,基于spring boot建成的服务注册中心是一个单节点的服务注册中心,这样一旦发生了故障,那么整个服务就会瘫痪,所以我们需要一个高可用的服务注册中心,那么在Eureka中,我们通过集群来解决这个问题。啥叫集群呢?就是多配几个,一个服务注册中心挂了,还有另一个。

    服务提供者:被其他微服务调用的微服务

    服务消费者:调用的其他微服务的微服务

    另外要注意jdk的版本需要1.8或1.8以上,否则无法执行。

    1 但这里我遇到了一个奇怪的问题:本来我的jdk版本是1.6的,我需要更换。但是怎么配置环境
    2 变量,在命令行输入java -version仍然是1.6,这里并不是配错了,而是在安装JDK1.6时,
    3 自动将java.exe、javaw.exe、javaws.exe三个可执行文件复制到了C:Windows
    4 System32目录,我们所执行的java命令正是这个java.exe所以我们先需要将这3个可执行
    5 文件删除,然后再配置jdk1.8

    另附java环境搭建方法

    https://jingyan.baidu.com/article/c85b7a6414f2ee003bac95d5.html

    那开始项目吧!

    1、首先创建一个高可用的服务注册中心吧,取名为erueka-server

      

    2、pom.xml内容配置

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     4     <modelVersion>4.0.0</modelVersion>
     5 
     6     <groupId>wfw.wlovet</groupId>
     7     <artifactId>eureka-server</artifactId>
     8     <version>0.0.1-SNAPSHOT</version>
     9     <packaging>jar</packaging>
    10   
    11     <name>eureka-server</name>
    12     <description>Demo project for Spring Boot</description>
    13 
    14     <parent>
    15         <groupId>org.springframework.boot</groupId>
    16         <artifactId>spring-boot-starter-parent</artifactId>
    17         <version>1.5.6.RELEASE</version>
    18         <relativePath/> <!-- lookup parent from repository -->
    19     </parent>
    20 
    21     <properties>
    22         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    23         <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    24         <java.version>1.8</java.version>
    25     </properties>
    26 
    27     <dependencies>
    28         <dependency>
    29             <groupId>org.springframework.boot</groupId>
    30             <artifactId>spring-boot-starter</artifactId>
    31         </dependency>
    32 
    33         <dependency>
    34             <groupId>org.springframework.cloud</groupId>
    35             <artifactId>spring-cloud-starter-eureka-server</artifactId>
    36         </dependency>
    37 
    38         <dependency>
    39             <groupId>org.springframework.boot</groupId>
    40             <artifactId>spring-boot-starter-test</artifactId>
    41             <scope>test</scope>
    42         </dependency>
    43     </dependencies>
    44 
    45     <dependencyManagement>
    46         <dependencies>
    47             <dependency>
    48                 <groupId>org.springframework.cloud</groupId>
    49                 <artifactId>spring-cloud-dependencies</artifactId>
    50                 <version>Dalston.SR3</version>
    51                 <type>pom</type>
    52                 <scope>import</scope>
    53             </dependency>
    54         </dependencies>
    55     </dependencyManagement>
    56     <build>
    57         <plugins>
    58             <plugin>
    59                 <groupId>org.springframework.boot</groupId>
    60                 <artifactId>spring-boot-maven-plugin</artifactId>
    61             </plugin>
    62         </plugins>
    63     </build>
    64 </project>

    3、两个配置文件之peer1的内容

    1 server.port=1111
    2 eureka.instance.hostname=peer1
    3 eureka.client.register-with-eureka=false
    4 eureka.client.fetch-registry=false
    5 eureka.client.service-url.defaultZone=http://peer2:1112/eureka/

    4、两个配置文件之peer2的内容

    1 server.port=1112
    2 eureka.instance.hostname=peer2
    3 eureka.client.register-with-eureka=false
    4 eureka.client.fetch-registry=false
    5 eureka.client.service-url.defaultZone=http://peer1:1111/eureka/

    关于这两个配置文件需要知道如下几点:

    1.在peer1的配置文件中,让它的service-url指向peer2,在peer2的配置文件中让它的service-url指向peer1
    2.为了让peer1和peer2能够被正确的访问到,我们需要在C:WindowsSystem32driversetc目录下的hosts文件总添加两行配置,如下:
    127.0.0.1 peer1
    127.0.0.1 peer2
    3.由于peer1和peer2互相指向对方,实际上我们构建了一个双节点的服务注册中心集群 
    

     5、java程序启动代码

     1 import org.springframework.boot.SpringApplication;
     2 import org.springframework.boot.autoconfigure.SpringBootApplication;
     3 import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
     4 
     5 @EnableEurekaServer
     6 @SpringBootApplication
     7 public class Application {
     8     public static void main(String[] args) {
     9         SpringApplication.run(Application.class, args);
    10     }
    11 }

      最后包的结构:

        

    6、将该maven项目打包成可执行的.jar文件

    选中pom.xml文件,右击鼠标点击run,选择Maven install,等待即可
    

      

     7、生成jar文件之后,我们在命令行通过java命令来启动项目,在启动的时候我们可以设置采用不同的配置文件来启动项目,命令如下:

    1 java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1  
    2 java -jar eureka-server-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2

    8、在浏览器中进行验证

    输入localhost:1111与localhost:1112

    9、接下来创建一个服务提供者,取名为server-provider

    10、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>wfw.wlovet</groupId>
        <artifactId>provider</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
        <name>provider</name>
        <description>Demo project for Spring Boot</description>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <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>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.cloud</groupId>
                <artifactId>spring-cloud-starter-eureka</artifactId>
            </dependency>
        </dependencies>
        <dependencyManagement>
            <dependencies>
                <dependency>
                    <groupId>org.springframework.cloud</groupId>
                    <artifactId>spring-cloud-dependencies</artifactId>
                    <version>Dalston.SR3</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>

     11、application.properties的配置为

    spring.application.name=hello-service
    eureka.client.serviceUrl.defaultZone=http://peer1:1111/eureka/,http://peer2:1112/eureka/

    12、控制类HelloController代码为

    package com.wlovet.controller;
    
    import java.util.List;
    
    import org.apache.log4j.Logger;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.client.ServiceInstance;
    import org.springframework.cloud.client.discovery.DiscoveryClient;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class HelloController {
        private final Logger logger = Logger.getLogger(getClass());
        @Autowired
        private DiscoveryClient client;
    
        @RequestMapping(value = "/hello", method = RequestMethod.GET)
        public String index() {
            List<ServiceInstance> instances = client.getInstances("hello-service");
            for (int i = 0; i < instances.size(); i++) {
                logger.info("/hello,host:" + instances.get(i).getHost() + ",service_id:" + instances.get(i).getServiceId());
            }
            return "Hello World";
        }
    }

    13、启动类ServerApplication代码为

    package com.wlovet;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    
    @SpringBootApplication
    @EnableDiscoveryClient//此处注解必须
    public class ServerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ServerApplication.class, args);
        }
    }

    14、打包成可执行的jar文件|打包教程请看上文

      最后包的结构:

        

    15、在命令行中输入

    java -jar provider-0.0.1-SNAPSHOT.jar --server.port=8081
    java -jar provider-0.0.1-SNAPSHOT.jar --server.port=8082

     

    16、最后创建一个服务消费者,取名为ribbon-consumer

    17、pom.xml配置为,此处增加了spring-cloud-starter-ribbon

    <?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>wfw.wlovet</groupId>
        <artifactId>ribbon-consumer</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <packaging>jar</packaging>
    
        <name>ribbon-consumer</name>
        <description>Demo project for Spring Boot</description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>1.5.6.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
    
        <properties>
            <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
            <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
            <java.version>1.8</java.version>
            <spring-cloud.version>Dalston.SR3</spring-cloud.version>
        </properties>
    
        <dependencies>
            <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.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.apache.xbean</groupId>
                <artifactId>xbean-spring</artifactId>
                <version>4.2</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>
                    spring-boot-starter-data-elasticsearch
                </artifactId>
            </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>

     18、application.propertes配置内容为(作为测试我只打开一个服务注册中心)

    spring.application.name=ribbon-consumer
    server.port=9000
    eureka.client.service-url.defaultZone=http://peer1:1111/eureka

    19、启动类ConsumerApplication的内容为

    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    import org.springframework.cloud.client.loadbalancer.LoadBalanced;
    import org.springframework.context.annotation.Bean;
    import org.springframework.web.client.RestTemplate;
    @SpringBootApplication
    @EnableDiscoveryClient
    public class ConsumerApplication {
    
        public static void main(String[] args) {
            SpringApplication.run(ConsumerApplication.class, args);
        }
        
        //LoadBalanced负责加载负载均衡
        @LoadBalanced
        @Bean
        RestTemplate restTemplate() {
            //RestTemplate为负载均衡
            return new RestTemplate();
        }
    }

    20、控制转发类ConsumerController的内容为

    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.RestController;
    import org.springframework.web.client.RestTemplate;
    
    @RestController
    public class ConsumerController {
        @Autowired
        RestTemplate restTemplate;
    
        @RequestMapping(value = "/ribbon-consumer", method = RequestMethod.GET)
        public String helloController() {
            return restTemplate.getForEntity("http://hello-service/hello", String.class).getBody();
        }
    }

       最后包的结构:

        

    21、测试项目

      启动服务注册中心---->启动服务提供项目---->启动服务消费项目---->在浏览器内输入localhost:9000/ribbon-consumer

      结果为:

           

      

      

    至此,简单的微服务就搭好了!

     em。。。。但我在运行ribbon-consumer的时候又遇到一个奇怪的问题,感觉我好像说过相同的话。。。

      

      啊?有点莫名奇妙-.-!,然后自己手动导包解决的,em。。。。不知所以然

  • 相关阅读:
    跨域常见解决方案
    express-session的简单使用说明
    Spring Cloud中,如何解决Feign/Ribbon第一次请求失败的问题?
    继承父类的静态方法的加载顺序
    sql索引优化
    EXPLAIN 执行计划详解
    JVM总括二-垃圾回收:GC Roots、回收算法、回收器
    dubbo知识体系
    Spring bean的生命流程
    日志体系与异常处理
  • 原文地址:https://www.cnblogs.com/wlovet/p/7955620.html
Copyright © 2011-2022 走看看