github.com/kaituanwang/hyperledger@v2.0.1+incompatible/docs/source/developapps/gateway.md (about) 1 # Gateway 2 3 **Audience**: Architects, application and smart contract developers 4 5 A gateway manages the network interactions on behalf of an application, allowing 6 it to focus on business logic. Applications connect to a gateway and then all 7 subsequent interactions are managed using that gateway's configuration. 8 9 In this topic, we're going to cover: 10 11 * [Why gateways are important](#scenario) 12 * [How applications use a gateway](#connect) 13 * [How to define a static gateway](#static) 14 * [How to define a dynamic gateway for service discovery](#dynamic) 15 * [Using multiple gateways](#multiple-gateways) 16 17 ## Scenario 18 19 A Hyperledger Fabric network channel can constantly change. The peer, orderer 20 and CA components, contributed by the different organizations in the network, 21 will come and go. Reasons for this include increased or reduced business demand, 22 and both planned and unplanned outages. A gateway relieves an application of 23 this burden, allowing it to focus on the business problem it is trying to solve. 24 25 ![gateway.scenario](./develop.diagram.25.png) *A MagnetoCorp and DigiBank 26 applications (issue and buy) delegate their respective network interactions to 27 their gateways. Each gateway understands the network channel topology comprising 28 the multiple peers and orderers of two organizations MagnetoCorp and DigiBank, 29 leaving applications to focus on business logic. Peers can talk to each other 30 both within and across organizations using the gossip protocol.* 31 32 A gateway can be used by an application in two different ways: 33 34 * **Static**: The gateway configuration is *completely* defined in a [connection 35 profile](./connectionprofile.html). All the peers, orderers and CAs 36 available to an application are statically defined in the connection profile 37 used to configure the gateway. For peers, this includes their role as an 38 endorsing peer or event notification hub, for example. You can read more about 39 these roles in the connection profile [topic](./connectionprofile.html). 40 41 The SDK will use this static topology, in conjunction with gateway 42 [connection options](./connectionoptions), to manage the transaction 43 submission and notification processes. The connection profile must contain 44 enough of the network topology to allow a gateway to interact with the 45 network on behalf of the application; this includes the network channels, 46 organizations, orderers, peers and their roles. 47 48 49 * **Dynamic**: The gateway configuration is minimally defined in a connection 50 profile. Typically, one or two peers from the application's organization are 51 specified, and they use [service discovery](../discovery-overview.html) to 52 discover the available network topology. This includes peers, orderers, 53 channels, deployed smart contracts and their endorsement policies. (In 54 production environments, a gateway configuration should specify at least two 55 peers for availability.) 56 57 The SDK will use all of the static and discovered topology information, in 58 conjunction with gateway connection options, to manage the transaction 59 submission and notification processes. As part of this, it will also 60 intelligently use the discovered topology; for example, it will *calculate* 61 the minimum required endorsing peers using the discovered endorsement policy 62 for the smart contract. 63 64 You might ask yourself whether a static or dynamic gateway is better? The 65 trade-off is between predictability and responsiveness. Static networks will 66 always behave the same way, as they perceive the network as unchanging. In this 67 sense they are predictable -- they will always use the same peers and orderers 68 if they are available. Dynamic networks are more responsive as they understand 69 how the network changes -- they can use newly added peers and orderers, which 70 brings extra resilience and scalability, at potentially some cost in 71 predictability. In general it's fine to use dynamic networks, and indeed this 72 the default mode for gateways. 73 74 Note that the *same* connection profile can be used statically or dynamically. 75 Clearly, if a profile is going to be used statically, it needs to be 76 comprehensive, whereas dynamic usage requires only sparse population. 77 78 Both styles of gateway are transparent to the application; the application 79 program design does not change whether static or dynamic gateways are used. This 80 also means that some applications may use service discovery, while others may 81 not. In general using dynamic discovery means less definition and more 82 intelligence by the SDK; it is the default. 83 84 ## Connect 85 86 When an application connects to a gateway, two options are provided. These are 87 used in subsequent SDK processing: 88 89 ```javascript 90 await gateway.connect(connectionProfile, connectionOptions); 91 ``` 92 93 * **Connection profile**: `connectionProfile` is the gateway configuration that 94 will be used for transaction processing by the SDK, whether statically or 95 dynamically. It can be specified in YAML or JSON, though it must be converted 96 to a JSON object when passed to the gateway: 97 98 ```javascript 99 let connectionProfile = yaml.safeLoad(fs.readFileSync('../gateway/paperNet.yaml', 'utf8')); 100 ``` 101 102 Read more about [connection profiles](./connectionprofile.html) and how 103 to configure them. 104 105 106 * **Connection options**: `connectionOptions` allow an application to declare 107 rather than implement desired transaction processing behaviour. Connection 108 options are interpreted by the SDK to control interaction patterns with 109 network components, for example to select which identity to connect with, or 110 which peers to use for event notifications. These options significantly reduce 111 application complexity without compromising functionality. This is possible 112 because the SDK has implemented much of the low level logic that would 113 otherwise be required by applications; connection options control this logic 114 flow. 115 116 Read about the list of available [connection options](./connectionoptions.html) 117 and when to use them. 118 119 ## Static 120 121 Static gateways define a fixed view of a network. In the MagnetoCorp 122 [scenario](#scenario), a gateway might identify a single peer from MagnetoCorp, 123 a single peer from DigiBank, and a MagentoCorp orderer. Alternatively, a gateway 124 might define *all* peers and orderers from MagnetCorp and DigiBank. In both 125 cases, a gateway must define a view of the network sufficient to get commercial 126 paper transactions endorsed and distributed. 127 128 Applications can use a gateway statically by explicitly specifying the connect 129 option `discovery: { enabled:false }` on the `gateway.connect()` API. 130 Alternatively, the environment variable setting `FABRIC_SDK_DISCOVERY=false` 131 will always override the application choice. 132 133 Examine the [connection 134 profile](https://github.com/hyperledger/fabric-samples/blob/master/commercial-paper/organization/magnetocorp/gateway/networkConnection.yaml) 135 used by the MagnetoCorp issue application. See how all the peers, orderers and 136 even CAs are specified in this file, including their roles. 137 138 It's worth bearing in mind that a static gateway represents a view of a network 139 at a *moment in time*. As networks change, it may be important to reflect this 140 in a change to the gateway file. Applications will automatically pick up these 141 changes when they re-load the gateway file. 142 143 ## Dynamic 144 145 Dynamic gateways define a small, fixed *starting point* for a network. In the 146 MagnetoCorp [scenario](#scenario), a dynamic gateway might identify just a 147 single peer from MagnetoCorp; everything else will be discovered! (To provide 148 resiliency, it might be better to define two such bootstrap peers.) 149 150 If [service discovery](../discovery-overview.html) is selected by an 151 application, the topology defined in the gateway file is augmented with that 152 produced by this process. Service discovery starts with the gateway definition, 153 and finds all the connected peers and orderers within the MagnetoCorp 154 organization using the [gossip protocol](../gossip.html). If [anchor 155 peers](../glossary.html#anchor-peer) have been defined for a channel, then 156 service discovery will use the gossip protocol across organizations to discover 157 components within the connected organization. This process will also discover 158 smart contracts installed on peers and their endorsement policies defined at a 159 channel level. As with static gateways, the discovered network must be 160 sufficient to get commercial paper transactions endorsed and distributed. 161 162 Dynamic gateways are the default setting for Fabric applications. They can be 163 explicitly specified using the connect option `discovery: { enabled:true }` on 164 the `gateway.connect()` API. Alternatively, the environment variable setting 165 `FABRIC_SDK_DISCOVERY=true` will always override the application choice. 166 167 A dynamic gateway represents an up-to-date view of a network. As networks 168 change, service discovery will ensure that the network view is an accurate 169 reflection of the topology visible to the application. Applications will 170 automatically pick up these changes; they do not even need to re-load the 171 gateway file. 172 173 ## Multiple gateways 174 175 Finally, it is straightforward for an application to define multiple gateways, 176 both for the same or different networks. Moreover, applications can use the name 177 gateway both statically and dynamically. 178 179 It can be helpful to have multiple gateways. Here are a few reasons: 180 181 * Handling requests on behalf of different users. 182 183 * Connecting to different networks simultaneously. 184 185 * Testing a network configuration, by simultaneously comparing its behaviour 186 with an existing configuration. 187 188 <!--- Licensed under Creative Commons Attribution 4.0 International License 189 https://creativecommons.org/licenses/by/4.0/ -->