美文网首页我爱编程
Spring Boot进阶 之 水平扩展

Spring Boot进阶 之 水平扩展

作者: 诺之林 | 来源:发表于2018-04-13 14:45 被阅读171次

    本文的示例代码参考MultiServices

    目录

    Nginx

    Installation

    brew install nginx
    
    sed -i "" 's/8080/80/g' /usr/local/etc/nginx/nginx.conf
    
    sudo brew services start nginx
    
    brew services list
    
    • 测试
    curl localhost
    
    <!DOCTYPE html>
    <html>
    <head>
    <title>Welcome to nginx!</title>
    <style>
        body {
            width: 35em;
            margin: 0 auto;
            font-family: Tahoma, Verdana, Arial, sans-serif;
        }
    </style>
    </head>
    <body>
    <h1>Welcome to nginx!</h1>
    <p>If you see this page, the nginx web server is successfully installed and
    working. Further configuration is required.</p>
    
    <p>For online documentation and support please refer to
    <a href="http://nginx.org/">nginx.org</a>.<br/>
    Commercial support is available at
    <a href="http://nginx.com/">nginx.com</a>.</p>
    
    <p><em>Thank you for using nginx.</em></p>
    </body>
    </html>
    

    Prepare

    mkdir Nginx
    
    # cd Nginx
    spring init -b 1.5.6.RELEASE -dweb --build gradle Service1
    
    spring init -b 1.5.6.RELEASE -dweb --build gradle Service2
    

    Service1

    # cd Service1
    vim src/main/java/com/example/Service1/DemoController.java
    
    package com.example.Service1;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class DemoController {
        @GetMapping("/demo")
        public String demo() {
            return "Service1: " + "demo";
        }
    }
    
    echo "server.port=9000" >> src/main/resources/application.properties 
    
    • 测试
    ./gradlew bootrun
    
    curl localhost:9000/demo # 返回"Service1: demo"
    

    Service2

    # cd Service2
    vim src/main/java/com/example/Service2/DemoController.java
    
    package com.example.Service2;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class DemoController {
        @GetMapping("/demo")
        public String demo() {
            return "Service2: " + "demo";
        }
    }
    
    echo "server.port=9001" >> src/main/resources/application.properties 
    
    • 测试
    ./gradlew bootrun
    
    curl localhost:9001/demo # 返回"Service2: demo"
    

    Configuration

    sudo vim /usr/local/etc/nginx/nginx.conf
    
    # add lines
    upstream ms {
        server 127.0.0.1:9000;
        server 127.0.0.1:9001;
    }
    
    server {
        listen 80;
        server_name multiservices.test;
        location / {
            proxy_pass http://ms;
        }
    }
    
    sudo nginx -s reload
    
    sudo sh -c "echo '127.0.0.1 multiservices.test' >> /etc/hosts"
    
    • 测试
    curl multiservices.test/demo # 返回"Service2: demo"
    
    curl multiservices.test/demo # 返回"Service1: demo"
    

    ZooKeeper

    Installation

    brew install zookeeper
    
    brew services start zookeeper
    
    brew services list
    
    • 测试
    zkCli
    
    Connecting to localhost:2181
    Welcome to ZooKeeper!
    JLine support is enabled
    [zk: localhost:2181(CONNECTING) 0] 
    WATCHER::
    
    WatchedEvent state:SyncConnected type:None path:null
    

    Prepare

    mkdir ZooKeeper
    
    # cd ZooKeeper
    spring init -b 1.5.6.RELEASE -dweb --build gradle Provider1
    
    spring init -b 1.5.6.RELEASE -dweb --build gradle Provider2
    
    spring init -b 1.5.6.RELEASE -dweb --build gradle Consumer
    

    Provider1

    # cd Provider1
    vim build.gradle
    
    # add lines
    dependencies {
        compile('org.springframework.boot:spring-boot-starter-web')
        compile('org.springframework.cloud:spring-cloud-starter-zookeeper-discovery')
        testCompile('org.springframework.boot:spring-boot-starter-test')
    }
    
    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:Edgware.SR3"
        }
    }
    
    sed -i "" '/SpringBootApplication;/a\
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    ' src/main/java/com/example/Provider1/DemoApplication.java
    
    sed -i "" '/@SpringBootApplication/a\
    @EnableDiscoveryClient
    ' src/main/java/com/example/Provider1/DemoApplication.java
    
    vim src/main/java/com/example/Provider1/DemoController.java
    
    package com.example.Provider1;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class DemoController {
        @GetMapping("/demo")
        public String demo() {
            return "Provider1: " + "demo";
        }
    }
    
    mv src/main/resources/application.properties src/main/resources/application.yml
    
    tee src/main/resources/application.yml <<-'EOF'
    spring:
      application:
        name: Provider
      cloud:
        zookeeper:
          connect-string: localhost:2181
          discovery:
            enabled: true
    server:
      port: 9000
    EOF
    
    • 测试
    ./gradlew bootrun
    
    [localhost:2181)] org.apache.zookeeper.ClientCnxn          : Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
    [localhost:2181)] org.apache.zookeeper.ClientCnxn          : Socket connection established to localhost/127.0.0.1:2181, initiating session
    [localhost:2181)] org.apache.zookeeper.ClientCnxn          : Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x162bc7bf0510009, negotiated timeout = 40000
    
    curl localhost:9000/demo # 返回"Provider1: demo"
    

    Provider2

    # cd Provider2
    vim build.gradle
    
    # add lines
    dependencies {
        compile('org.springframework.boot:spring-boot-starter-web')
        compile('org.springframework.cloud:spring-cloud-starter-zookeeper-discovery')
        testCompile('org.springframework.boot:spring-boot-starter-test')
    }
    
    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:Edgware.SR3"
        }
    }
    
    sed -i "" '/SpringBootApplication;/a\
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    ' src/main/java/com/example/Provider2/DemoApplication.java
    
    sed -i "" '/@SpringBootApplication/a\
    @EnableDiscoveryClient
    ' src/main/java/com/example/Provider2/DemoApplication.java
    
    vim src/main/java/com/example/Provider2/DemoController.java
    
    package com.example.Provider2;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class DemoController {
        @GetMapping("/demo")
        public String demo() {
            return "Provider2: " + "demo";
        }
    }
    
    mv src/main/resources/application.properties src/main/resources/application.yml
    
    tee src/main/resources/application.yml <<-'EOF'
    spring:
      application:
        name: Provider
      cloud:
        zookeeper:
          connect-string: localhost:2181
          discovery:
            enabled: true
    server:
      port: 9001
    EOF
    
    • 测试
    ./gradlew bootrun
    
    [localhost:2181)] org.apache.zookeeper.ClientCnxn          : Opening socket connection to server localhost/127.0.0.1:2181. Will not attempt to authenticate using SASL (unknown error)
    [localhost:2181)] org.apache.zookeeper.ClientCnxn          : Socket connection established to localhost/127.0.0.1:2181, initiating session
    [localhost:2181)] org.apache.zookeeper.ClientCnxn          : Session establishment complete on server localhost/127.0.0.1:2181, sessionid = 0x162bc7bf0510009, negotiated timeout = 40000
    
    curl localhost:9001/demo # 返回"Provider2: demo"
    

    Consumer

    # cd Consumer
    vim build.gradle
    
    # add lines
    dependencies {
        compile('org.springframework.boot:spring-boot-starter-web')
        compile('org.springframework.cloud:spring-cloud-starter-zookeeper-discovery')
        compile('org.springframework.cloud:spring-cloud-starter-openfeign')
        testCompile('org.springframework.boot:spring-boot-starter-test')
    }
    
    dependencyManagement {
        imports {
            mavenBom "org.springframework.cloud:spring-cloud-dependencies:Edgware.SR3"
        }
    }
    
    sed -i "" '/SpringBootApplication;/a\
    import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
    ' src/main/java/com/example/Consumer/DemoApplication.java
    
    sed -i "" '/@SpringBootApplication/a\
    @EnableDiscoveryClient
    ' src/main/java/com/example/Consumer/DemoApplication.java
    
    sed -i "" '/EnableDiscoveryClient;/a\
    import org.springframework.cloud.netflix.feign.EnableFeignClients;
    ' src/main/java/com/example/Consumer/DemoApplication.java
    
    sed -i "" '/@EnableDiscoveryClient/a\
    @EnableFeignClients
    ' src/main/java/com/example/Consumer/DemoApplication.java
    
    vim src/main/java/com/example/Consumer/DemoController.java
    
    package com.example.Consumer;
    
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.RestController;
    
    @RestController
    public class DemoController {
        @GetMapping("/demo")
        public String demo() {
            return "Consumer: " + "demo";
        }
    }
    
    • 测试
    ./gradlew bootrun
    
    curl localhost:8080/demo # 返回"Consumer: demo"
    
    vim src/main/java/com/example/Consumer/ProviderClient.java
    
    package com.example.Consumer;
    
    import org.springframework.cloud.netflix.feign.FeignClient;
    import org.springframework.web.bind.annotation.GetMapping;
    
    @FeignClient("Provider")
    public interface ProviderClient {
        @GetMapping("/demo")
        String demo();
    }
    
    vim src/main/java/com/example/Consumer/DemoController.java
    
    // 省略了包名和导入文件
    
    @RestController
    public class DemoController {
        @Autowired
        private ProviderClient providerClient;
    
        @GetMapping("/demo")
        public String demo() {
            return providerClient.demo();
        }
    }
    
    • 测试
    ./gradlew bootrun
    
    curl localhost:8080/demo # 返回"Provider1: demo"
    
    curl localhost:8080/demo # 返回"Provider2: demo"
    

    参考

    相关文章

      网友评论

        本文标题:Spring Boot进阶 之 水平扩展

        本文链接:https://www.haomeiwen.com/subject/jpxfkftx.html